调试Visual C ++ DLL而不调用应用程序的/ Host Exe源代码

时间:2014-11-03 23:17:08

标签: c++ visual-studio visual-c++

客户端向我们发送了一个崩溃转储,其中包含我们的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)

1 个答案:

答案 0 :(得分:2)

使用与客户端完全相同的二进制文件开始调试。然后在模块窗口中检查你的dll的基地址,然后从崩溃转储添加偏移量。在反汇编窗口(debug - > windows - >反汇编)中,在地址:editbox中输入十六进制格式0xXXXXXXXX的计算崩溃地址。这应该显示您感兴趣的源代码行。

问题是如何计算崩溃偏移量,您应该在崩溃日志模块部分中有dll加载地址,这应该足以计算崩溃偏移量。这应该是0x6BAA7271 - [dll base offset]。

我不使用dll-s,但这应该可行。

此外,如果您在给定产品版本的源代码控制中添加了标记,则更容易调试此类问题。然后你签出这样的标签分支,这允许你生成pdb-s并用程序进行实验。