【发布时间】:2011-11-09 12:20:56
【问题描述】:
背景:我正在使用 windbg 来诊断来自 Microsoft 的 WinQual 服务的小型转储的原因。我花时间在与构建它们时相同的路径位置中正确设置 PDB 和二进制文件,并且我在使用 windbg 和此设置时非常幸运。
今天我遇到了一个小型转储,我真的很想通过反汇编来了解问题,但是 windbg 只会反转函数的一部分。
我的函数如下所示:
SomeStruct* STDCALL getThing(int id)
{
S_ASSERT(a);
S_ASSERT(b);
S_ASSERT(c);
SomeStruct* result = fn(id);
S_ASSERT(d);
return result;
}
S_ASSERT 是我们的宏,它最终调用一个函数,其中int 3 指令被命中,即使在发布版本中也是如此。如果不检查拆卸,我只是无法判断是哪一个被击中。
使用windbg,我可以跳转到调用堆栈中的getThing,激活反汇编并查看一些代码,但无法在反汇编中向后滚动。然后我在module!getThing 上添加了一个手表来获取函数地址,并将该地址写在反汇编窗口中。而不是指令,我得到〜100行???然后是一些看起来不像函数入口点但看起来像正确函数的一部分的反汇编。它看起来像这样:
No prior disassembly possible
module!getThing:
1d7d4aa0 ?? ???
1d7d4aa1 ?? ???
1d7d4aa2 ?? ???
...
1d7d4b0a 087d1c or byte ptr [ebp+1Ch],bh
1d7d4b0d 8b4004 mov eax,dword ptr [eax+4]
1d7d4b10 8bf9 mov edi,ecx
1d7d4b12 83e11f and ecx,1Fh
1d7d4b15 bb01000000 mov ebx,1
...
那么,我怎样才能说服 windbg 显示其余的反汇编?或者,我是否误解了结果?除了 Visual Studio 之外,还有其他软件能够加载小型转储吗?
感谢您提供的任何见解!
【问题讨论】:
-
这可能是转储只有堆栈和可直接访问的内存(很小的一个),您能检查一下您正在检查的小型转储存储了哪些信息吗?
标签: windbg disassembly