Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么赢了';t windbg分解我的一半功能?_Windbg_Disassembly - Fatal编程技术网

为什么赢了';t windbg分解我的一半功能?

为什么赢了';t windbg分解我的一半功能?,windbg,disassembly,Windbg,Disassembly,背景:我正在使用windbg诊断来自微软WinQual服务的小型转储的原因。我花了时间在构建PDB和二进制文件时的同一路径位置正确地设置它们,并且我在windbg和此设置中获得了非常好的运气 今天我遇到了一个小型转储,我真的很想通过反汇编来了解问题,但是windbg只会反转函数的一部分 我的函数如下所示: SomeStruct* STDCALL getThing(int id) { S_ASSERT(a); S_ASSERT(b); S_ASSERT(c); So

背景:我正在使用windbg诊断来自微软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;
}
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
...
S_ASSERT
是我们的宏,它最终会调用一个函数,在这个函数中,
int 3
指令会被命中,即使在发布版本中也是如此。如果不检查拆卸情况,我就说不出哪一个被击中了

使用windbg,我可以跳转到调用堆栈中的
getting
,激活反汇编并查看一些代码,但不能在反汇编中向后滚动。然后我在
模块上添加了一块手表!获取函数地址,并在反汇编窗口中写入该地址。我得到的不是指令,而是大约100行的???然后是一些反汇编,看起来不像函数入口点,但看起来确实像正确函数的一部分。看起来是这样的:

SomeStruct* STDCALL getThing(int id)
{
    S_ASSERT(a);
    S_ASSERT(b);
    S_ASSERT(c);
    SomeStruct* result = fn(id);
    S_ASSERT(d);
    return result;
}
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展示其余的反汇编呢?或者,我是否误解了结果?除了VisualStudio之外,还有其他软件可以加载小型转储吗


感谢您提供的任何见解

确保符号路径(
.sympath
)或exe路径(
.exepath
)中有相同的dll或exe的副本。使用
!sym noised
重新加载
并验证windbg是否找到此dll。

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