“第一次机会异常”信息中的十六进制数字是什么意思?

7
例如,在以下消息中:

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

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

3
猜测它是分配异常对象的位置。 - Alexandre C.
如果真的能这样就太棒了。我们可以使用内存窗口查看抛出对象的数据。这对于由库内部引发和处理的异常尤其有用。 - sashoalm
@satuon:做了一些测试,似乎是这样的情况。 - Jerry Coffin
1个回答

2

正如你所猜测的那样,第一个是异常发生时的EIP(或64位代码的RIP)。

经过一些测试,第二个数字是被捕获的异常对象的地址。但请记住,这与被抛出的异常对象的地址不同。例如,我编写了以下测试代码:

#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 在其“first chance exception”消息中显示的第二个地址与我在上面代码中获得的 x 地址相匹配。

@BenVoigt:我刚刚进行了一些测试,并编辑了答案。如果您能看一下并确定它是否有所改进,我会很感激(我也很感激您的评论)。 - Jerry Coffin
等等,那个异常不是在堆栈上抛出的吗?所以你在catch中接收到的是一个指向已经解开的堆栈地址的指针? - sashoalm
@Jerry:是的,在编辑后,这是有关Microsoft C++异常的一次处理中显示地址的很好的解释。+1 - Ben Voigt
1
@satuon:异常对象绝对不能存储在堆栈上。异常对象的生命周期规则很复杂,人们甚至使用它们来实现完整的线程本地存储,仅使用可移植的C ++。 - Ben Voigt
@BenVoigt:你有关于线程本地存储的指针吗? - Alexandre C.
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接