调用堆栈字节偏移量

时间:2012-12-15 16:23:00

标签: c++ visual-studio-2010

在Visual Studio 2010的Call Stack窗口中,字节偏移量在行号旁边引用了什么?

Test.exe!__tmainCRTStartup()  Line 547 + 0x2c bytes

为什么有些堆栈帧有字节偏移而其他堆栈帧没有?

1 个答案:

答案 0 :(得分:6)

调试器通常只有公共符号的地址,如__tmainCRTStartup()。但是代码可能在函数内部的任何偏移处执行。没有任何符号。所以你看到了符号地址的偏移量。

值得注意的是,在调试版本构建代码的情况下,由于代码在函数内部执行,其符号未进入.pdb文件,因此可能会看到较大的偏移量。然后,行号也将丢失,这对于发布构建代码非常典型,因为在代码优化器移动代码之后行号变得毫无意义。通过链接器的/ PDBSTRIPPED选项从.pdb文件中删除 行号。

像+ 0x2c这样的偏移是一个非常可靠的指示,它实际上在命名函数中。偏移越大,几率逐渐下降。你看到的符号,例如+ 0x2000偏移几乎肯定是不可靠的。使用Windows系统DLL的符号文件进行调试时,这种情况并不罕见。

长话短说:你看到执行指令从函数开始的偏移量。