我有一大堆小型應用程序通過MiniDumpWriteDump在應用程序的運行時記錄下來的。小型轉儲器是在一臺與我的開發機器不同的操作系統版本的機器上創建的。如何從小轉儲中提取堆棧跟蹤?
現在我正在嘗試編寫一個程序,使用dbghelp.dll從小型轉儲中提取堆棧跟蹤。我正在走MINIDUMP_MODULE_LIST並調用SymLoadModule64,但是無法從公共符號服務器下載pdbs(kernel32等)。如果我添加「C:\ Windows \ System32下」的符號路徑找到的DLL文件並下載符號,但當然他們不匹配從轉儲的dll文件,所以結果是無用的。
那麼我該如何告訴dbghelp.dll下載並使用正確的pdbs?
[編輯]
我忘了指出SymLoadModule64只需要一個文件名,並沒有版本/校驗和信息,所以很明顯與SymLoadModule64唯有它是不可能的DBGHELP找出要下載的PDB。
的信息是在MINIDUMP_MODULE_LIST實際可用的,但我不知道如何將它傳遞迴dbghelp的API。
有SymLoadModuleEx這需要額外的參數,但我不知道如果這就是我需要的還是什麼,我應該通過對其他參數。
[編輯]
至今沒有運氣,但我注意到這裏還有dbgeng.dll與調試SDK dbghelp.dll一起分發。 MSDN看起來有很好的文檔記錄,並表示它與windbg使用的引擎相同。也許我可以使用它來提取堆棧跟蹤。
如果任何人都可以點我的一些介紹如何使用dbgeng.dll處理小型轉儲,可能會幫助過,因爲只有MSDN文檔的各個組件而不是它們如何協同工作。
你可能讓你的minidump太小了。用DumpType參數修補。確保Debug + Windows + Modules列表顯示準確的DLL路徑,版本和時間戳記。 –
不,這不是問題,我可以加載WinDbg中的小型轉儲就好了,它可以正確下載PDB。這只是我想自動執行堆棧檢索,而不是在WinDbg中手動檢查轉儲。 – Zarat
如果你想要去黑客路線,你可以傳遞命令到ntsd並捕獲輸出 –