写这篇文章参考了使用 Google Breakpad 来助力解决程序崩溃-腾讯云开发者社区-腾讯云
xcode编译生成的dylib给electron项目使用,崩溃后根据dmp文件来定位dylib崩溃的地方。
1、编译dylib的时候设置生成dwarf with dsym file格式的调试信息
2、编译后找到生成的dylib和dsym文件。
3、下载breakpad代码编译
git clone https://github.com/google/breakpad.git
./configure --prefix="/Users/luobo/tmp/breakpad"
make
make install
这一步生成了下面3个可执行文件
4、打开/Users/luobo/breakpad/src/tools/mac/dump_syms目录下的dump_syms.xcodeproj编译生成dump_syms文件
5、将dylib,dsym,minidump_stackwalk,dump_syms,dmp文件都放到一个目录
执行下列步骤:
1)./dump_syms -a x86_64 libLiveTranslate.dylib.dSYM > libLiveTranslate.dylib.sym
这一步生成了可读的符号表文件.sym
(libLiveTranslate.dylib.sym不能写成libLiveTranslate.sym,而且libLiveTranslate也不能改,要和自己的原始文件名一致,x86_64根据自己的文件的架构来)
2)head -n1 libLiveTranslate.dylib.sym
输出MODULE mac x86_64 E4CDCC10BABC3DD7B4979479B14B07D70 libLiveTranslate.dylib
3)mkdir -p symbols/libLiveTranslate.dylib/E4CDCC10BABC3DD7B4979479B14B07D70
(E4CDCC10BABC3DD7B4979479B14B07D70是上一步输出的,libLiveTranslate.dylib不要写错,根据自己的文件名修改)
4)mv libLiveTranslate.dylib.sym symbols/libLiveTranslate.dylib/E4CDCC10BABC3DD7B4979479B14B07D70
5)./minidump_stackwalk 9a2bf54f-281f-4e57-8889-91dfea49138e.dmp symbols > crashed9a2bf54f-281f-4e57-8889-91dfea49138e.log
(minidump_stackwalk不要弄成microdump_stackwalk了)
6、打开crashed9a2bf54f-281f-4e57-8889-91dfea49138e.log文件查看崩溃堆栈,我的如下:
我们可以看到它崩溃在miniaudio.h的13577行。
7、如果无法定位到指定崩溃的行号,可能是符号表查找失败,我们观察一下控制台的输出,有可能是上面路径没写对。
找不到符号表的输出:
2023-11-20 10:21:05: simple_symbol_supplier.cc:199: INFO: No symbol file at symbols/libLiveTranslate.dylib/E4CDCC10BABC3DD7B4979479B14B07D70/libLiveTranslate.dylib.sym
2023-11-20 10:21:05: stackwalker.cc:108: INFO: Couldn't load symbols for: libLiveTranslate.dylib|E4CDCC10BABC3DD7B4979479B14B07D70
正确找到symbol输出
2023-11-20 10:31:40: source_line_resolver_base.cc:244: INFO: Loading symbols for module /Library/WebServer/Documents/code/electron-vue/extraResources/libLiveTranslate.dylib from memory buffer, size: 75339180