【发布时间】:2012-12-15 16:23:00
【问题描述】:
在Visual Studio 2010的Call Stack窗口中,行号旁边的字节偏移指的是什么?
Test.exe!__tmainCRTStartup() Line 547 + 0x2c bytes
为什么有些栈帧有字节偏移,而有些则没有?
【问题讨论】:
在Visual Studio 2010的Call Stack窗口中,行号旁边的字节偏移指的是什么?
Test.exe!__tmainCRTStartup() Line 547 + 0x2c bytes
为什么有些栈帧有字节偏移,而有些则没有?
【问题讨论】:
调试器通常只有公共符号的地址,例如 __tmainCRTStartup()。但是代码可能在该函数内部执行,位于函数开头的任何偏移处。没有任何符号。所以你看到的是符号地址的偏移量。
值得注意的是,在调试发布构建代码的情况下,由于在函数内部执行的代码未将其符号放入 .pdb 文件中,您可能会看到较大的偏移量。然后行号也会丢失,这对于发布构建代码来说非常典型,因为在代码优化器移动代码后行号变得毫无意义。行号被链接器的 /PDBSTRIPPED 选项从 .pdb 文件中剥离。
像 +0x2c 这样的偏移量是一个非常可靠的指示,它实际上是在命名函数内部。偏移量越大,赔率越低。你看到的符号,比如说,+0x2000 偏移量几乎肯定是不可靠的。使用 Windows 系统 DLL 的符号文件进行调试时并不罕见。
长话短说:您会看到执行指令与函数开头的偏移量。
【讨论】: