客户端向我们发送了一个崩溃转储,其中包含我们的dll汇编指令的十六进制地址。我如何将它与visual studio上的c ++代码联系起来?
我们的程序打包在一个dll中,然后由远程服务器上的主机应用程序加载。我们有dll的源代码,但不是主机应用程序。调试dll导致崩溃的最佳方法是什么?
crash : #214 0001BD54 EIP: 6BAA7271 ESP: 240DF640
6BAA7271:000000 [6BAA7271] unknown (ourcompany.dll)
6BA9FA31:000000 [6BA9FA31] unknown (ourcompany.dll)
6BA994D9:000000 [6BA994D9] unknown (ourcompany.dll)
6BA9F5F2:000000 [6BA9F5F2] unknown (ourcompany.dll)
6BAADB36:000000 [6BAADB36] unknown (ourcompany.dll)
6BAADBB4:000000 [6BAADBB4] unknown (ourcompany.dll)
76EC3378:000012 [76EC338A] AcquireSRWLockExclusive
(kernel32.dll)
775D9F0F:000063 [775D9F72] RtlInsertElementGenericTableAvl
(ntdll.dll)
775D9F0F:000036 [775D9F45] RtlInsertElementGenericTableAvl
(ntdll.dll)
crash --> 6BAA7271 80780F00 cmp byte [eax+0xf], 0x0
6BAA7275 74EB jz 0x6baa7262
6BAA7277 8B8310040000 mov eax, [ebx+0x410]
6BAA727D 89BD24FDFFFF mov [ebp+0xfffffd24], edi
6BAA7283 3BF8 cmp edi, eax
6BAA7285 740E jz 0x6baa7295
6BAA7287 663B770C cmp si, [edi+0xc]
: #215 000167B0 EIP: 752178D7 ESP: 37F3FC00
7521787B:00005C [752178D7] DlgDirSelectComboBoxExW
(user32.dll)
62AD0013:000000 [62AD0013] unknown (***.dll)
76EC3378:000012 [76EC338A] AcquireSRWLockExclusive
(kernel32.dll)
775D9F0F:000063 [775D9F72] RtlInsertElementGenericTableAvl
(ntdll.dll)
775D9F0F:000036 [775D9F45] RtlInsertElementGenericTableAvl
(ntdll.dll)
答案 0 :(得分:2)
使用与客户端完全相同的二进制文件开始调试。然后在模块窗口中检查你的dll的基地址,然后从崩溃转储添加偏移量。在反汇编窗口(debug - > windows - >反汇编)中,在地址:editbox中输入十六进制格式0xXXXXXXXX的计算崩溃地址。这应该显示您感兴趣的源代码行。
问题是如何计算崩溃偏移量,您应该在崩溃日志模块部分中有dll加载地址,这应该足以计算崩溃偏移量。这应该是0x6BAA7271 - [dll base offset]。
我不使用dll-s,但这应该可行。
此外,如果您在给定产品版本的源代码控制中添加了标记,则更容易调试此类问题。然后你签出这样的标签分支,这允许你生成pdb-s并用程序进行实验。