程序異常崩潰后用windbg輔助調試解決的經驗 以及 堆棧問題調試經驗


1,程序異常崩潰后用windbg輔助調試解決的經驗 

 

狀況:我的程序調用別人的庫做 文件寫入工作。

          在這一過程中出現異常,程序崩潰。

          經反復檢查,認為自己的程序沒有錯,但無法判斷在別人庫里哪里有錯。

 

 

使用windbg綁定程序進程進行調試,可以在發生異常時候,獲取函數調用順序,進而知道在哪個函數出了異常。

由截圖可見,在我的程序函數CEncryptionUtils::write_user_certs調用別人的MWHwMan庫的SDFP_Close函數中調用另一個人的sdfp_lib庫中的SD_SafeWrite函數過程中調用TGWriteDevInfo函數時發生了  堆異常…………………………

 

所以我找到sdfp_lib庫作者,剛好是我同事,找他確認這個函數……然后解決問題……………………

 

上文說的只是調試這種問題的一種思路

可以說,如果沒有windbg我是永遠不可能解決這個問題的

 

至於windbg的具體用法就不贅述

或有時間時候再贅述

 

后續補充兩點:1,將編譯生成的pbd放在目錄,用windbg調試可以提供更多信息,可以具體提供崩潰代碼行數

                         2,崩潰時可以打開任務管理器,選擇進程,導出dump文件,再分析dump文件亦可,只是這種方法沒有試過

 

2,堆棧問題調試經驗

編程時特別痛苦的就是遇到程序異常閃退問題,特別是那種偶然發生難以復現的bug、特別是那類debug版本沒事、release版本就會崩潰的情況、甚至還有64位操作系統下沒問題32位操作系統下就有問題的情況…………

即使可以使用windbg一類軟件來查看堆棧,也未必有用。

因為程序崩潰的那一行,未必是堆棧造成損壞的那一行。

因為程序總是在堆棧損壞情況下,再次使用堆棧才會發生崩潰。

 

例如下面這個困擾我半個月的bug:

上述是一個別人寫的底層庫的函數

結果竟然有錯

這里malloc長度不應該是length*2,而應該是malloc(length*2+1)

否則這里的'\0'必然會寫在越界的位置上!!

 

這個問題之前在win7 64位上跑一直沒發現,在32位下才顯現。

真可怕。

 

至於難以確認程序出錯的具體位置。

這類問題該如何定位呢?

方法就是排除法,將懷疑有問題的代碼一處處注釋掉。

如果注釋了就不會崩潰就說明 堆棧破損問題沒有出在這里。

例如我最后發現,只要不調用上述截圖那個dll庫函數就不會崩潰,漸漸定位到這個函數里,再具體分析有沒有內存越界問題。

 

上述這些都是公司里的大神教的,

感謝!

 

 

3,如果是在沒裝vs的環境下使用windbg調試,可以將編譯的pdb文件放過去

這樣不同的是,windbg顯示堆棧信息時候會同時顯示代碼行數


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM