crash都是發生在某一函式中, 而95%的crash都是由下面兩種情況中的一種導致的:
因此要分析crash dump, 大多數情況都是尋找錯誤資料的**. 下面是一些常見的, 導致資料錯誤的例子:
使用了未初始化的變數. 比如沒有分配記憶體的指標, 沒有初始化的criticalsection.
錯誤地計算了函式引數. 比如呼叫函式的時候弄錯了傳入引數的順序, 字串操作時算錯了字串長度.
錯誤地使用資料導致發生corruption. 比如double free導致heap curruption, 在多執行緒環境下忘記同步導致據全域性變數計算錯誤, com的addref和release呼叫不配對.
違背程式邏輯地使用資料. 比如在程式載入必要的資源以前就開始使用這些資源的函式.
由此可見, crash dump的分析完全取決於程式的情況. 能否從crash dump中挖掘出有用的資訊, 取決於:
一般來說, 分析乙個dump可以通過下面的步驟入手:
看清楚是何種異常導致的崩潰.
對齊symbol, 找到發生崩潰的函式名字, 以及對應的彙編**和源**.
列出callstack
檢查callstack是否合理
檢查發生崩潰的函式是否得到了正確的引數.
檢查發生崩潰的函式使用的資料是否正確.
結合上面的資訊, 構思來龍去脈, 然後用資料來證明, 或者反駁自己的猜想.
通過進一步的操作來獲取更有意義的資料. 比如啟用pageheap後, 重新抓取dump, 或者乾脆進行live debug
關於crt的文章:
摘自: crash都是發生在某一函式中,而95 的crash都是由下面兩種情況中的一種導致的 因此要分析crash dump,大多數情況都是尋找錯誤資料的 下面是一些常見的,導致資料錯誤的例子 使用了未初始化的變數.比如沒有分配記憶體的指標,沒有初始化的criticalsection.錯誤地計算了函式引數.... crash都是發生在某一函式中,而95 的crash都是由下面兩種情況中的一種導致的 因此要分析crash dump,大多數情況都是尋找錯誤資料的 下面是一些常見的,導致資料錯誤的例子 使用了未初始化的變數.比如沒有分配記憶體的指標,沒有初始化的criticalsection.錯誤地計算了函式引數.... 最常用的就是這三個,尤其是erase,老是忘了怎麼用 1 常不小心誤用的函式 erase 不要直接使用erase i i為下標 根本沒這個用法,會導致非法訪問記憶體。只有以下三種用法 1 erase pos,n 刪除從pos開始的n個字元,比如erase 0,1 就是刪除第乙個字元 2 erase ...Crash dump中需要重點關注的資訊
Crash dump中需要重點關注的資訊
String中重點需要注意的函式用法