【问题标题】:call stack byte offset调用栈字节偏移
【发布时间】:2012-12-15 16:23:00
【问题描述】:

在Visual Studio 2010的Call Stack窗口中,行号旁边的字节偏移指的是什么?

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

为什么有些栈帧有字节偏移,而有些则没有?

【问题讨论】:

    标签: c++ visual-studio-2010


    【解决方案1】:

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

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

    像 +0x2c 这样的偏移量是一个非常可靠的指示,它实际上是在命名函数内部。偏移量越大,赔率越低。你看到的符号,比如说,+0x2000 偏移量几乎肯定是不可靠的。使用 Windows 系统 DLL 的符号文件进行调试时并不罕见。

    长话短说:您会看到执行指令与函数开头的偏移量。

    【讨论】:

    • 值得强调的是,有时这意味着即使你得到的函数名也是错误的——运行的代码碰巧接近那个函数,但在其他方面是不相关的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-03
    • 2023-04-06
    • 1970-01-01
    • 2022-01-09
    相关资源
    最近更新 更多