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