Breakpad 入門

簡介

Breakpad 是一個庫和工具集,它使你可以給用戶分發(fā)移除了編譯器提供的調(diào)試信息的應(yīng)用程序,但以兼容 "minidump" 的文件格式記錄崩潰,把它們發(fā)送回你的服務(wù)器,并從這些 minidumps 生成 C 和 C++ 的棧追蹤。Breakpad 也可以在收到請求時寫入沒有崩潰的程序的 minidumps。

Breakpad 當(dāng)前已經(jīng)用在了 Google Chrome,F(xiàn)irefox,Google Picasa,Camino,Google Earth,及其它許多項目中。

breakpad.png

Breakpad 有三個主要的組件:

  • client 是你包含在你的應(yīng)用程序中的庫。它可以寫入 minidump 文件,捕獲當(dāng)前線程的狀態(tài),以及當(dāng)前加載的可執(zhí)行文件和共享庫的識別信息。你可以配置客戶端在崩潰發(fā)生時,或在顯式請求時寫入 minidump。

  • symbol dumper 是一個讀取編譯器產(chǎn)生的調(diào)試信息,并生成 符號文件 的程序,以 Breakpad 自己的格式。

  • processor 是讀取 minidump 文件,為 minidump 涉及的可執(zhí)行文件和共享庫版本,查找適當(dāng)?shù)姆栁募?,并生成一個人類可讀的 C/C++ 棧追蹤。

minidump 文件格式

minidump 文件格式類似于 core 文件,但它是由 Microsoft 為它們的崩潰上報設(shè)施開發(fā)的。一個 minidump 文件包含:

  • 創(chuàng)建 dump 時進(jìn)程中加載的可執(zhí)行文件和共享庫的列表。這個列表包含加載的那些文件的特定版本的文件名和標(biāo)識符。

  • 進(jìn)程中出現(xiàn)的線程。對于每個線程,minidump 包含處理器寄存器的狀態(tài),以及線程的棧內(nèi)存的內(nèi)容。這些數(shù)據(jù)都是未經(jīng)解釋的字節(jié)流,Breakpad 客戶端通常沒有調(diào)試信息可用來生成函數(shù)名或行號,或者甚至識別棧幀邊界。

  • 關(guān)于收集 dump 所在的系統(tǒng)的其它信息:處理器和操作系統(tǒng)版本,dump 的原因,等等等。

Breakpad 在所有平臺上都使用 Windows 的 minidump 文件,而不是傳統(tǒng)的 core 文件,出于如下一些原因:

  • Core 文件可能非常大,使它們無法通過網(wǎng)絡(luò)發(fā)送到收集器進(jìn)行處理。Minidumps 更小,因為它們本來就是設(shè)計來這樣用的。

  • Core 文件格式的文檔記錄很差。比如 Linux Standards Base 沒有描述在 PT_NOTE 段中寄存器是如何存儲的。

  • 讓 Windows 機(jī)器生成 core dump 文件比讓其它機(jī)器寫 minidump 文件更難。

  • 只支持一種文件格式簡化了 Breakpad 處理器。

minidump 概述/生命周期

minidump 通過調(diào)用 Breakpad 庫生成。默認(rèn)情況下,初始化 Breakpad 安裝一個異常/信號處理器,它在發(fā)生異常時把 minidump 寫入磁盤。在 Windows 上,這通過 SetUnhandledExceptionFilter() 完成;在 OS X 上,這通過創(chuàng)建一個線程等待在 Mach 異常端口上來完成;而在 Linux 上,這通過為各種各樣的異常,比如 SIGILL,SIGSEGV 等安裝信號處理器來完成。

一旦生成了 minidump,每個平臺都有略微不同的方式來上傳崩潰轉(zhuǎn)儲。在 Windows 和 Linux 上,提供了一個單獨的函數(shù)庫,可以調(diào)用它來執(zhí)行上傳。在 OS X 上,會生成一個單獨的進(jìn)程,提示用戶授予權(quán)限(如果配置為這樣做)并發(fā)送文件。

術(shù)語

進(jìn)程內(nèi) vs 進(jìn)程外異常處理 - 通常認(rèn)為在崩潰的進(jìn)程內(nèi)寫入 minidump 是不安全的 - 關(guān)鍵的進(jìn)程數(shù)據(jù)結(jié)構(gòu)可能已經(jīng)被破壞,或者異常處理器所運(yùn)行的棧可能已經(jīng)被覆寫,等等。所有 3 個平臺都支持所謂的 “進(jìn)程外” 異常處理。

集成概述

Breakpad 代碼概述

所有的客戶端代碼可以通過訪問位于 https://chromium.googlesource.com/breakpad/breakpad 的 Google Project 找到。src 目錄具有如下的目錄結(jié)構(gòu):

  • processor 包含 minidump 處理的代碼,它們用在服務(wù)端,而不是用在客戶端。

  • client 包含所有平臺的客戶端 minidump 生成庫

  • tools 包含在各個平臺上構(gòu)建各種工具的源碼和工程。

(在其他目錄中)

構(gòu)建過程細(xì)節(jié)(符號生成)

這適用于所有平臺。src/tools/{platform}/dump_syms 內(nèi)有一個工具,它可以讀取各個平臺的調(diào)試信息 (比如 OS X/Linux 的 DWARF 和 STABS,和 Windows 的 PDB 文件),并生成一個 Breakpad 符號文件。這個工具應(yīng)該針對你 strip 之前的二進(jìn)制文件運(yùn)行(在 OS X/Linux 的情況下),且符號文件需要存儲在某個 minidump 處理器可以找到的地方。還有另一個工具,symupload,如果你已經(jīng)編寫了一個可以接收它們的服務(wù)器,則可以用來上傳符號文件。

參考文檔

Getting started with breakpad

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容