2014-09-18 72 views
2

我正試圖隔離Windows上的本機代碼中的內存泄漏。DebugDiag調用堆棧不顯示調用堆棧中函數的行數

我運行了一個測試用例的多次迭代,並將DebugDiag附加到進程中以收集有關可疑泄漏(通過PerfMon中的多次運行確認的內存泄漏)的信息。

DebugDiag資料指出可疑調用堆棧像

Call stack sample 1 

Address 0x0f09e2c0 

Allocation Time 00:22:38 since tracking started 

Allocation Size 8.54 KBytes 

    Function          Source destination 
    ntdll!RtlpReAllocateHeap+19c     ntdll!RtlAllocateHeap 
    ntdll!_except_handler4  
    ntdll!RtlReAllocateHeap+22f     ntdll!RtlReAllocateHeap 
    sqlncli11!MpReallocZeroMemory+66  
    sqlncli11!SQLReAllocateMemoryEx+22   sqlncli11!MpReallocZeroMemory 
    sqlncli11!AllocPlex+1a4      sqlncli11!SQLReAllocateMemoryEx 
    sqlncli11!SetADRec+2a4      sqlncli11!AllocPlex 
    sqlncli11!SQLBindCol+217      sqlncli11!SetADRec 
    odbc32!SQLBindCol+3c0  
    sscfdm!CSSLockSqlCursor::DoExecuteStmt+11a  
    sscfdm!CSSSqlCursor::Execute+129    sscfdm!CSSLockSqlCursor::DoExecuteStmt 
    sscfdm!CSSSqlObj::Execute+d86     sscfdm!CSSSqlCursor::Execute 
    sscfom!CSSBusComp::SqlExecute+3a    sscfdm!CSSSqlObj::Execute 
    <<many multiple lines below>> 

我已經正確配置的符號,現在我想知道我怎麼提取調用堆棧的詳細信息。

  1. UMDH日誌在它們的差異日誌中也有行號(帶有文件名)。但是,在DebugDiag報告中,我沒有找到這些函數的任何行號。如果函數真的非常長,那麼通過查看沒有行號的調用堆棧來描述上下文變得很困難。有沒有什麼辦法可以從DebugDiag日誌中提取函數(文件)的行號?

  2. 我想知道的另一件事是調用堆棧中的每個module!function條目的十六進制偏移的意義。

  3. 調用堆棧中的分配大小是多少?這是分配的內存還沒有被釋放(因此泄漏)每次執行此調用堆棧?

  4. 有關DebugDiag功能綜合文檔的任何指針?

回答

0

UMDH日誌在他們的差異日誌行號太(與文件名)。但是在調試診斷報告中,我沒有找到這些函數的任何行號。

好吧,然後去UMDH日誌。

十六進制偏移的意義,每個調用棧中的module!function條目。

十六進制偏移量指向已編譯方法中的特定彙編程序指令。它與源代碼中的行號偏移大致相關,但可能會受到編譯器優化的嚴重影響。

調用堆棧中的分配大小是多少?難道是沒有被釋放所分配的內存...

...按照此調用堆棧的執行?

否再次運行相同的方法可能會分配不同的大小。考慮一個像AllocateSomeMemory(int bytes)這樣的函數,它將取決於分配多少內存的參數。

任何指向有關DebugDiag資料的能力

對不起全面的文檔,我不能提一個很好的網站了我的頭。