1. 程式人生 > >Breakpad 跨平臺崩潰報告系統 入門指南

Breakpad 跨平臺崩潰報告系統 入門指南

Breakpad 既是一個函式庫又是一個工具箱,它讓你可以在釋出應用程式給使用者時移除編譯器提供的除錯資訊,它會在一種簡潔的"minidump"格式的檔案中記錄程式崩潰資訊,併發送回你的伺服器,而且可以從這些minidump檔案中處理得到 C 和 C++ 堆疊記錄(stack trace). Breakpad 也可以按要求給沒有崩潰的程式寫minidump檔案.

Breakpad 正被 Google Chrome, Firefox, Google Picasa, Camino, Google Earth 和別的一些專案使用.

Breakpad 有三個主要部分:

•客戶端(client) 是一個可以包含在程式中的庫. 它可以把當前執行緒的狀態和已裝載的可執行庫跟共享庫的識別符號寫進minidump檔案. 你可以配置客戶端在程式崩潰時寫一個minidump或只有顯式要求時才寫.
•符號清潔工(symbol dumper)是一個讀取編譯器產生的資訊的程式,它能在讀取後產生一個符號檔案(symbol file),這個檔案的格式是
•處理器(processor)是也是一個程式,他讀取minidump檔案,並給minidump檔案提到的可執行庫和共享庫找到合適的符號檔案,然後產生一個可讀的 C/C++ 堆疊記錄.
minidump檔案格式
minidump檔案格式類似於微軟為崩潰上傳功能(crash-uploading facility)開發的核心檔案(core files). minidump 檔案包含:

•一個在垃圾場(dump)建立時系統載入的可執行庫和共享庫的列表. 這個列表包含檔名和已裝載版本的檔案的識別符號.
•當前程序中的執行緒列表. 對於每一個執行緒, minidump 檔案包含了處理器的暫存器的狀態和執行緒的堆疊記憶體. 這些資料是不能解讀的位元組流, 因為Breakpad 客戶端一般沒有可用的除錯資訊來產生函式名或行號,甚至識別堆疊框架的邊界.
•收集到的建立垃圾場的系統的其他資訊: 處理器、作業系統版本和垃圾場產生原因等等.
Breakpad 在所有平臺上使用 Windows minidump 檔案, 而不是傳統的核心檔案(core files), 有這些原因:

•核心檔案會很大,這使得把它們通過網路傳送到收集器端進行處理很不使用. Minidump 檔案更小,因為它們就是為了這麼用而設計的.
•核心檔案格式不規範. 比如, Linux標準庫(Linux Standards Base) 沒有描述暫存器是如何儲存在 PT_NOTE 段中的.
•與讓別的機器寫minidump檔案相比,讓windows機器處理核心會更難.
•它使 Breakpad 處理器簡化到只需支援一種檔案格式.
minidump 是通過呼叫 Breakpad庫產生的. 預設情況下,初始化Breakpad會安裝一個異常/訊號處理器,這個處理器會在異常出現時會寫一個minidump檔案到硬碟. 在 Windows 上, 這是通過SetUnhandledExceptionFilter()完成的; 在 OS X 上, 這是通過建立一個在Mach 異常埠的執行緒完成的; 在Linux 上, 這是通過安裝多種異常(如SIGILL, SIGSEGV等)的訊號處理控制代碼完成的.

在minidump檔案產生後,每個平臺都有稍微不同與其他平臺的上傳崩潰crash dump. 在 Windows和 Linux, 有一個獨立的函式庫可以呼叫去上傳. 在 OS X, 如何設定好了,就會產生一個獨立的程序,請求使用者許可權,然後傳送這個檔案.

程序內(In-process) vs. 程序外(out-of-process)異常處理 - 一般認為在崩潰的程序中寫minidump檔案不安全- 關鍵程序資料結構會被破壞,或者異常處理控制代碼所在堆疊會被覆蓋,等等。所有三個平臺都支援程序外異常處理.

所有的客戶端 程式碼都能通過訪問在

•processor 包含了只在伺服器端使用的 minidump處理程式碼
•client 包含了所有平臺的客戶端產生minidump的函式庫。
•tools 包含了每個平臺下編譯一系列工具的原始碼和工程。
(在別的目錄中)

•Windows Integration Guide
建立程序的細節(符號產生)
這可用於所有的平臺。在src/tools/{platform}/dump_syms 中是一個可以讀取各個平臺下除錯資訊和產生Breakpad 符號檔案的的工具(如 X/Linux的DWARF 和 STABS, Windows的PDB 檔案),它還能產生一個Breakpad符號檔案. 這個工具在剝離之前在執行(on your binary before it's stripped)(在OS X/Linux上) 而且符號檔案要放在minidump 處理器可以找的到的地方.有另外一個工具, symupload,如果你寫了可以接收它們的伺服器,可以用來上傳符號檔案.