Crashpad編譯
Crashpad 是由 Google 開發的一個開源的跨平臺崩潰報告庫,主要用于在應用程序崩潰時收集和提交崩潰信息。通常,我們需要cmake來編譯項目,但由于crashpad不使用cmake編譯,因此要實現源碼編譯crashpad,需要編寫cmakelists.txt來編譯。
git clone github.com/TheAssemblyArmada/crashpad-cmake.git
在cmakelists.txt中添加:
add_subdirectory(crashpad-cmake)
crashpad原理(翻譯自官方文檔)
Crashpad捕獲導致崩潰的異常的詳細做法在不同操作系統之間有所不同。
macOS
在macOS上,操作系統將通過設置為客戶端進程異常端口的Mach端口通知客戶端崩潰的處理程序。由于在macOS上,內核將異常分派到Mach端口,因此在異常發生時,可以完全通過Crashpad處理程序處理異常,而無需在異常發生時在崩潰進程中運行任何代碼。
iOS
在iOS上,操作系統將通過Mach異常端口或信號處理程序通知崩潰的處理程序。由于異常在進程內處理,因此生成的是中間轉儲文件而不是迷你轉儲。有關iOS進程內處理程序的更多信息,請參閱更多信息。
Windows
在Windows上,操作系統在崩潰線程的上下文中分派異常。為了通知處理程序異常,Crashpad客戶端在客戶端進程中注冊一個UnhandledExceptionFilter(UEF)。當異常傳播到UEF時,它將異常信息和崩潰線程的ID存儲在注冊到處理程序的ExceptionInformation結構中。然后,它設置一個事件句柄以通知處理程序繼續處理異常。
注意事項
如果在異常發生時崩潰線程的堆棧被破壞,無法分派異常。在這種情況下,操作系統將立即終止進程,處理程序將無法生成崩潰報告。
如果在崩潰線程中處理異常,它將永遠不會傳播到UEF,因此不會生成崩潰報告。在Windows中,這在系統庫通常會在結構化異常處理程序下分派回調時發生。在某些系統配置中,在Windows消息分派期間以及例如DLL入口點通知期間經常發生這種情況。
在系統和運行時中存在越來越多的條件,檢測到的破壞或非法調用導致進程被立即終止,這種情況下將不會生成崩潰報告。
進程外異常處理
在Windows錯誤報告(WER)中存在一種機制,允許客戶端進程注冊以處理崩潰進程外的客戶端異常。不幸的是,這種機制難以使用,并且對上述許多注意事項并不提供覆蓋。詳細信息請參閱此處。
Linux/Android
在Linux上,異常被分派為信號發送到崩潰線程。Crashpad信號處理程序將通過套接字向Crashpad處理程序發送消息,通知其崩潰的位置以及從崩潰進程中讀取的異常信息。在使用共享套接字連接時,通信完全是單向的。客戶端將其轉儲請求發送到處理程序,然后等待處理程序以SIGCONT響應或超時發生。在使用私有套接字連接時,處理程序可以通過套接字響應以與ptrace代理進程通信。代理進程從崩潰進程派生,對崩潰進程執行ptrace請求,并通過套接字將信息發送到處理程序。