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顯示堆棧信息時候會同時顯示代碼行數
