2014-11-03 58 views
1

客戶端向我們發送了包含我們dll的彙編指令的十六進制地址的故障轉儲。我如何將它與visual studio上的C++代碼聯繫起來?調用Visual C++ DLL而不調用應用程序/ Host Exe源代碼

我們的程序打包在一個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

您是否在生成dll時生成了映射? – rrirower 2014-11-03 23:34:52

+0

@rrirower您的意思是一個.pdb文件嗎?是的,我們擁有它。 – gerrytan 2014-11-03 23:47:09

+0

編號.map文件可用於協調程序地址。這是您構建時的一個選項。 – rrirower 2014-11-04 00:12:45

回答

2

用與客戶端完全相同的二進制文件開始調試。然後在模塊窗口中檢查你的dll的基地址,然後從崩潰轉儲添加偏移量。在反彙編窗口(調試 - >窗口 - >反彙編)中輸入地址:編輯框以十六進制格式0xXXXXXXXX計算出的崩潰地址。這應該會顯示你感興趣的源代碼行。

問題是如何計算崩潰偏移量,你應該在你的崩潰日誌模塊部分有你的DLL加載地址,這應該足以計算出崩潰偏移量。這應該是0x6BAA7271 - [dll base offset]。

我不工作與DLL-S,但這應該工作。

此外,如果您在源代碼控制中標記了給定發佈的產品,則更容易調試此類問題。然後你簽出這樣的標籤,這允許你生成pdb-s並且用程序做實驗。

+0

Windows的基地址有時會被忽略。如果其他一些DLL使用相同的基址,則必須移動一個。 ASLR也會改變DLL的基地址。 – 2014-11-04 01:55:48

+0

謝謝這真的有幫助。要添加更多信息,應通過執行調試 - >附加到進程來調試主機exe應用程序。此外,窗口計算器程序有十六進制模式,這真的有助於計算相對地址/偏移量。 – gerrytan 2014-11-13 12:53:00

+0

也是一個好的崩潰轉儲應該有一個DLL模塊的列表,它的加載地址。像這樣:':705F0000 00047000 ourcompany.dll'。 (我相信這是加載地址和長度)。此信息對於計算堆棧跟蹤中的相對地址至關重要。 – gerrytan 2014-11-13 12:56:01