1. 程式人生 > >Google Breakpad 之一,跨平臺crash 處理上報系統簡介

Google Breakpad 之一,跨平臺crash 處理上報系統簡介

C/C++程式最棘手的時候就是一個字“掛”,總是經常和不經常的掛掉,尤其是那些線上的不經常掛的情況,光看日誌定位問題真的很難。

為解決C掛掛的問題,有必要提供一個跨平臺的crash處理系統,目前已知的支援平臺有windows 、Linux、 OS X 、android、等待。

下面就來看看Google自己用的系統:Breakpad

最好的介紹莫過於谷歌自己的:

谷歌翻譯-》本人修改版:(不一定準確)minidump-》小型轉儲

介紹

 Breakpad是一個庫和工具套件可以讓你釋出的應用程式(把編譯器提供的除錯資訊剝離掉的)給使用者,記錄了崩潰緊湊的“dump”檔案,傳送回您的伺服器,並從這些minidump產生C和C++堆疊蹤跡。Breakpad可以根據請求使沒有崩潰的程式

也可以寫出minidump。

目前使用Breakpad的有谷歌瀏覽器,火狐,谷歌的Picasa,卡米諾,谷歌地球,和其他專案。

Breakpad有三個主要元件:

  • 客戶端是一個庫,包含在您的應用程式中。 它可以獲取當前執行緒的狀態和當前載入的可執行檔案和共享庫的ID寫轉儲檔案。您可以配置客戶端發生了崩潰時寫入一個minidump時,或明確要求時。
  •  符號解除安裝器是一個程式,讀取由編譯器產生的除錯資訊,並生成一個使用Breakpad格式符號檔案  。
  • 處理器(minidump processor)是一個程式,讀取一個minidump檔案,找到相應的版本的符號檔案的(可執行檔案和共享庫的轉儲提到的),併產生了一個人可讀的C / C + +堆疊跟蹤。

小型轉儲檔案格式(即minidump)

轉儲檔案的格式是由微軟開發的類似儲存的檔案,崩潰便利上傳。一個minidump檔案包含:

  • 在建立dump的程序中載入​​的可執行檔案和共享庫列表。此列表中包含的特定版本載入的那些檔案的檔名和識別符號。
  • 在這個過程中存在的執行緒列表。對於每個執行緒轉儲包括處理器暫存器的狀態,執行緒的堆疊儲存器的內容。一般Breakpad客戶端沒有可用於產生函式名或行號,甚至確定堆疊幀的邊界的除錯資訊,所以這些資料是不可解釋的位元組流。
  • 其他收集的有關係統轉儲資訊比如:處理器和作業系統版本,轉儲的原因,等等。

 Breakpad在所有平臺上使用Windows dump檔案,而不是傳統的core檔案,有以下幾個原因:

  • core檔案可能會非常大,不適合在網路上傳送給收集器處理。minidump較小,因此它們被設計為使用這種方式。
  • core檔案格式缺乏文件資訊。例如,Linux標準庫不描述暫存器如何儲存在PT_NOTE段的。
  • 一個Windows機器上生成一個core dump檔案,比起其他機器上生成一個minidump檔案,哪個難很難說。
  • 簡化了Breakpad處理器,只支援一種檔案格式。

概述/一個小型轉儲的生命週期

通過呼叫到Breakpad庫生成一個minidump。預設初始化Breakpad時,安裝了一個異常/訊號handler,崩潰時可寫一個minidump到磁碟。在Windows上,這是通過SetUnhandledExceptionFilter()實現;在 OS X上,這是通過建立一個執行緒,等待的Mach exception埠,在Linux上,這是通過安裝一個訊號handler來應對程式的各種異常情況,如SIGILL,SIGSEGV等。

一旦生成minidump,每個平臺都有一個略有不同的方式上傳的崩潰dump。在Windows和Linux上,提供一個單獨的函式庫,可以被稱為做upload。在OS X上,一個單獨的程序產生,提示使用者是否允許,如果同意這樣做則傳送檔案。

術語

程序內與程序外的異常處理——程序內寫minidump通常被認為是不安全的,關鍵處理資料結構可能已經被破壞,異常處理程式執行所處的堆疊或可能已經被覆蓋,等等。所有3個平臺都支援“程序外”異常處理。

整合概述

Breakpad程式碼概述

  • 處理器---包含轉儲處理的程式碼,它用於在伺服器端,而不是在客戶端上使用
  • 客戶端---包含適用於所有平臺的客戶端轉儲產生庫
  • 工具---包含原始碼和專案,生成在每個平臺上的各種工具。

(在其他目錄)

生成過程的詳細資料(符號生成)

適用於所有平臺。src/tools/{platform}/dump_syms是一個工具,可以讀取每個平臺的除錯資訊(例如,OS X / Linux作業系統,DWARF和STABS,以及Windows,PDB檔案),和產生一個Breakpad的符號檔案。應在二進位制程式剝離符號之前(比如OS X/Linux)執行此工具,需要儲存dump在處理器可以找到的地方。還有另一種工具,symupload,可以上傳符號檔案。如果你寫了一個伺服器,可以接收它們。