【问题标题】:How to understand the call stack of Visual Studio?如何理解 Visual Studio 的调用栈?
【发布时间】:2023-04-08 02:30:01
【问题描述】:
  VCamD.ax!CFactoryTemplate::CreateInstance()  + 0x3f bytes 
> VCamD.ax!CClassFactory::CreateInstance()  + 0x7f bytes 

0x7f 和 0x3f 是什么?

【问题讨论】:

    标签: c++ visual-studio debugging


    【解决方案1】:

    这些值是指令指针与所列函数开头的偏移量。

    这是表达函数中当前正在执行的汇编指令的一种方式。类似于在编辑器中突出显示当前源代码行。除了偏移量是在汇编级别而不是源代码级别。

    【讨论】:

    • 你知道为什么滚动条在反汇编视图中不能正常工作吗?
    【解决方案2】:

    您获得了已剥离的 .pdb 文件。他们的源代码文件和行号信息已被删除。例如,您可以从 Microsoft 符号服务器获取典型的 .pdb 文件。

    没关系,反正你也拿不到源代码。如果没有行号信息,调试器将回退到使用其地址确实可用的“最近”符号,通常是函数入口点,并添加调用指令的偏移量。

    如果长时间的代码缺少调试信息,有时您会得到虚假信息。那个“最接近”的符号与原始代码没有任何关系。任何时候偏移量变得大于,哦,0x200 那么你应该淡化显示的符号名称的相关性。在 Windows 代码中有几个地方可以实际看到字符串变量的名称。您发布的堆栈跟踪具有很高的置信度,这些偏移量很小。

    【讨论】:

    • 程序中的标识符。就像函数的名称一样。 CFactoryTemplate 是类名,CreateInstance 是方法名。它们是调试信息文件中的符号。
    • “调试信息文件”是指.pdb文件吗?
    • 对不起,我对此有另一个疑问,符号是否只存在于可执行文件的调试版本中,而不存在于发布版本中?
    【解决方案3】:

    如果它在栈顶,那么它就是指令指针相对于给定符号的偏移量。因此,如果顶部堆栈帧是VCamD.ax!CClassFactory::CreateInstance() + 0x7f bytes,并且VCamD.ax!CClassFactory::CreateInstance() 在内存中的位置0x3000(显然是虚构的),那么EIP 当前是0x307f。这显示了你在函数中的距离。

    如果它在堆栈的更上层,那么它是从给定符号开始的返回偏移量。因此,如果VCamD.ax!CFactoryTemplate::CreateInstance() 调用了VCamD.ax!CClassFactory::CreateInstance(),并且VCamD.ax!CFactoryTemplate::CreateInstance() 位于0x4000 位置,那么当VCamD.ax!CClassFactory::CreateInstance() 返回时,EIP 将位于0x403f。

    需要注意的重要一点是,如果您看到类似 somedll!SomeFunc() + 0x5f33 bytes 的内容,您可以确定这不是正确的符号。由于函数很少有 0x5f33 字节长,您可以看到 EIP 只是在调试器没有符号的地方。

    【讨论】:

    • 你想象过EIP 的东西,对吧?我无法在 Visual Studio 中查看有关 EIP 的信息
    • 在您的监视窗口中,输入@eip,它会显示EIP 寄存器。另请参阅,en.wikipedia.org/wiki/Instruction_pointer
    • 哦,我现在看到了,很有趣!但是在“反汇编”视图中,是否可以转储所有的汇编代码?我试过了,但只能抓住一屏线。
    • 不,由于许多原因,反汇编比普通源代码要复杂得多……没有很好的方法知道反汇编的边界,有时甚至没有完美的方法来推断反汇编。记住在内存中它只是一堆字节。它可以被视为数据或代码。您可以在技术上跳转(显式设置 EIP)到多字节指令的中间,完全搞砸反汇编。如果要反汇编 DLL 文件,请使用 IDA。有免费版@hex-rays.com/idapro/idadownfreeware.htm
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    • 2010-09-11
    • 2013-09-27
    • 1970-01-01
    • 2010-11-09
    • 2012-11-10
    相关资源
    最近更新 更多