Linux環境下編譯Google BreakPad的步驟
# 1、使用git clone下載breakpad源代碼
git clone https://github.com/google/breakpad.git
# 2、下載linux_syscall_support.h系統調用頭文件
git clone https://chromium.googlesource.com/linux-syscall-support
# 3、在breakpad/src/third_party下創建lss目錄並拷貝到lss目錄下
cd breakpad/src/third_party
mkdir lss
cp linux_syscall_support.h ../breakpad/src/third_party/lss
# 4、編譯breakpad源代碼,可以參考github網站:https://github.com/google/breakpad
cd src
./configure
make
# 5、編譯結果產物
src/libbreakpad.a //.a靜態庫
src/processor/minidump_stackwalk //工具:從.sym符號文件和.dmp minudump文件中提取出完整信息
src/processor/minidump_dump
src/tools/linux/dump_syms/dump_syms //工具:提取so庫的.sym符號文件
src/tools/linux/md2core/minidump-2-core
等等
# 6、解析minudump文件
1) 使用./dump_syms工具提取so的符號信息
./dump_syms .so > libbreadpaddemo.so.sym
2) 給libbreadpaddemo.so.sym生成特定的目錄結構
head -n1 libbreadpaddemo.so.sym //使用head -n1命令查看libbreadpaddemo.so.sym文件第一行內容
//輸出:MODULE Linux arm64 4958HDKYUH2607A34686D5D8594UYHF libbreadpaddemo.so
mkdir -p ./symbol/libbreadpaddemo.so/4958HDKYUH2607A34686D5D8594UYHF
//創建子目錄libbreadpaddemo.so以及子目錄4958HDKYUH2607A34686D5D8594UYHF,所以需要執行上面的head -n1獲取內容
mv libbreadpaddemo.so.sym ./symbol/libbreadpaddemoe.so/4958HDKYUH2607A34686D5D8594UYHF0/
//將符號信息libbreadpaddemo.so.sym拷貝到4958HDKYUH2607A34686D5D8594UYHF子目錄下,最后結構如下:
├── symbol
│ └── libbreadpaddemo.so
│ └── 4958HDKYUH2607A34686D5D8594UYHF
│ └── libbreadpaddemo.so.sym
3) 調用minidump_stackwalk命令,將dmp文件和sym文件合成可讀的crash.txt
./minidump_stackwalk 4567c979-cecf-65a6-76fghytr-gteft03b.dmp ./symbol > crash.txt
4) crash.txt大致內容如下:
Thread 32 (crashed)
0 libbreakpad-core.so + 0xe880
...
1 libbreakpad-core.so + 0xe86c
...
2 libbreakpad-core.so + 0xe8cc
...
# 7、可以使用Android Studio自帶的minidump_stackwalk解析minidump文件的使用步驟
1) minidump_stackwalk.exe路徑在androidStudio\bin\lldb\bin下
執行minidump_stackwalk 4567c979-cecf-65a6-76fghytr-gteft03b.dmpp > crash.txt 得到文本內容的崩潰地址
2) aarch64-linux-android-addr2line.exe路徑在toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64\bin目錄下
執行aarch64-linux-android-addr2line -f -C -e libbreakpad-core.so 0xe880 0xe86c 0xe8cc 還原崩潰信息
arm-linux-androideabi-addr2line 使用方法介紹:
arm-linux-androideabi-addr2line -C -f -e ${SOPATH} ${Address}
-C -f //打印錯誤行數所在的函數名稱
-e //打印錯誤地址的對應路徑及行數
${SOPATH} //so庫路徑
${Address} //需要轉換的堆棧錯誤信息地址,可以添加多個,但是中間要用空格隔開
參考鏈接https://www.jianshu.com/p/1e15640fae7a