【问题标题】:Why won't windbg disassemble half of my function?为什么windbg不反汇编我的一半功能?
【发布时间】: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


【解决方案1】:

确保您在符号路径 (.sympath) 或 exe 路径 (.exepath) 中有 相同 dll 或 exe 的副本。使用!sym noisy.reload 并验证windbg 是否找到了这个dll。

【讨论】:

  • lm 命令显示我的 exe(发生崩溃的地方,我无法完全反转的功能所在的地方)加载了私有 pdb 符号。我确实收到了时间戳警告,但内部构建签名必须匹配,因为它会自动加载。
  • 加载 DLL 与加载符号不同,尽管两者都使用相似的机制来查找文件。这些符号为您提供地址和符号之间的映射(以及类型信息和行号等)。 DLL 是必需的,因为小型转储不包含完整的进程内存。调试器需要原始 DLL 的副本才能读取该内存。
  • 我以为你错了,但实际上你是完全正确的。如果找不到 EXE,我认为我不会看到任何反汇编,但 minidump 必须包含比预期更多的内容。将 EXE 复制到搜索路径中的某个位置解决了该问题。谢谢!也很抱歉耽搁了,我的工作生活很忙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-10
  • 1970-01-01
相关资源
最近更新 更多