【发布时间】:2023-04-08 02:30:01
【问题描述】:
VCamD.ax!CFactoryTemplate::CreateInstance() + 0x3f bytes
> VCamD.ax!CClassFactory::CreateInstance() + 0x7f bytes
0x7f 和 0x3f 是什么?
【问题讨论】:
标签: c++ visual-studio debugging
VCamD.ax!CFactoryTemplate::CreateInstance() + 0x3f bytes
> VCamD.ax!CClassFactory::CreateInstance() + 0x7f bytes
0x7f 和 0x3f 是什么?
【问题讨论】:
标签: c++ visual-studio debugging
这些值是指令指针与所列函数开头的偏移量。
这是表达函数中当前正在执行的汇编指令的一种方式。类似于在编辑器中突出显示当前源代码行。除了偏移量是在汇编级别而不是源代码级别。
【讨论】:
您获得了已剥离的 .pdb 文件。他们的源代码文件和行号信息已被删除。例如,您可以从 Microsoft 符号服务器获取典型的 .pdb 文件。
没关系,反正你也拿不到源代码。如果没有行号信息,调试器将回退到使用其地址确实可用的“最近”符号,通常是函数入口点,并添加调用指令的偏移量。
如果长时间的代码缺少调试信息,有时您会得到虚假信息。那个“最接近”的符号与原始代码没有任何关系。任何时候偏移量变得大于,哦,0x200 那么你应该淡化显示的符号名称的相关性。在 Windows 代码中有几个地方可以实际看到字符串变量的名称。您发布的堆栈跟踪具有很高的置信度,这些偏移量很小。
【讨论】:
如果它在栈顶,那么它就是指令指针相对于给定符号的偏移量。因此,如果顶部堆栈帧是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