“第一次机会例外......”消息中的十六进制数字是啥意思?

Posted

技术标签:

【中文标题】“第一次机会例外......”消息中的十六进制数字是啥意思?【英文标题】:What do the hex numbers in the "first-chance exception..." messages mean?“第一次机会例外......”消息中的十六进制数字是什么意思? 【发布时间】:2012-07-24 15:03:55 【问题描述】:

例如,在消息中:

foo.exe 中 0x757bd36f 处的第一次机会异常:Microsoft C++ 异常:_ASExceptionInfo 在内存位置 0x001278cc..

0x757bd36f 和 0x001278cc 是什么意思?我认为 0x757bd36f 表示抛出异常时的 EIP,但是第二个数字呢?

【问题讨论】:

是分配异常对象的地方。 如果是这样就好了。然后我们可以使用 Memory 窗口查看抛出对象的数据。这对于库内部引发和处理的异常尤其有用。 @satuon:做一些测试,似乎确实如此。 【参考方案1】:

正如您所推测的,第一个是异常发生时的 EIP(或 RIP,对于 64-it 代码)。

做一些测试,第二个数字是被捕获的异常对象的地址。但是请记住,这与抛出的异常对象的地址相同。比如我写了如下一段测试代码:

#include <iostream>
#include <conio.h>

class XXX   xxx;

void thrower()  
    throw xxx;


int main() 
    try 
        std::cout << "Address of xxx: " << (void *)&xxx << "\n";
        thrower();
    
    catch(XXX const &x) 
        std::cout << "Address of x: " << (void *)&x << "\n";
    
    getch();
    return 0;

至少在我的测试中,VS 在其“第一次机会异常”消息中显示的第二个地址与我在上面的代码中为 x 获得的地址匹配。

【讨论】:

你和我都写了同样的东西,但这仅适用于访问冲突。这是一个 C++ 异常 (throw blah;) @BenVoigt:我只是做了一些测试,并编辑了答案。如果您可以看看它是否有所改进,我将不胜感激(我也非常感谢您的评论)。 等等,这个异常不是扔到栈上了吗?所以你在你的 catch 中收到了一个指向堆栈上已经展开的地址的指针? @satuon:异常对象的分配有点棘手。该标准几乎不干涉,说异常对象的分配方式是未指定的(第 15.2/3 节,对于任何关心的人)。不同的编译器工作方式不同,而且我最近还没有仔细研究过 VC++ 是如何做到这一点的,以至于无法准确说明它是如何工作的。 Windows XP 在之前的 SEH 中添加了 VEH,这可能会影响其中的一部分,但我不确定影响有多大。 @satuon:异常对象肯定不能存储在堆栈上。异常对象的生命周期规则很复杂,人们甚至使用它们来实现全线程本地存储,只使用可移植的 C++。

以上是关于“第一次机会例外......”消息中的十六进制数字是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

跳过第一次机会例外

挂钩 InternetStatusCallback

java中的MD5工具类

如何在没有有用的调用堆栈的情况下调试难以重现的崩溃?

如何将看起来像十六进制数字的字符串转换为php中的实际十六进制数字?

如何将 int 转换为十六进制数并将其打印为 c 中的 3 位数字? [复制]