拉代码
- 开启
VPN
- 用
cmd
设置
1 2 3 4 5 |
git config --global --unset http.proxy git config --global --unset https.proxy git config --global http.proxy http://127.0.0.1:7890 git config --global https.proxy http://127.0.0.1:7890 |
- 在某个位置创建文件夹
1 |
mkdir breakpad && cd breakpad |
- 第一次拉代码用
fetch breakpad
- 这是默认
depot_tools
已经下好了,并且环境变量也设置好了
- 这是默认
- 遇到问题如下:
-
通过切分支解决
- 比如
chrome_99
- 比如
-
这个时候是第二次执行代码了,要用
gclient sync
生成构建配置
- 生成
gn
构建文件
1 2 3 |
cd src gn gen out/Default # 默认生成Debug配置 |
- 进行一些调整修改
is_debug = true
Debug
模式target_cpu = "x86"
32
位架构symbol_level = 2
包含完整调试符号
1 |
gn gen out/Debug --args="is_debug=true target_cpu=\"x64\" symbol_level=2" |
1 |
gn gen out/Release --args="is_debug=false target_cpu=\"x64\"" |
- 上面这种
ninja
和gn gen
的方法,实践过程中遇到各种问题,后面放弃转而使用gyp
方法
编译breakpad
python2.7
- 先安装了最新的
2.7
版本的python-2.7.18rc1.amd64.msi
gpy
- 下载了
chromium
这个版本的gpy包 - 解压缩后,进入压缩后的目录,执行:
1 |
python setup.py install |
- 定位了
gyp
的位置- 这一步可能需要
- 把
C:\Python27\lib\site-packages\
添加到了环境变量,位于python2
的下面
1 |
python -c "import gyp; print(gyp.__file__)" |
1 |
C:\Python27\lib\site-packages\gyp\__init__.pyc |
- 验证安装
1 2 3 4 |
d:\Download Repo\Chrome Download\chrome_gyp\gyp-master>gyp gyp: usage: gyp_main.py [options ...] [build_file ...] gyp_main.py: error: no build_file |
breakpad代码
- 在一次实践中,我是弄好环境后再拉的代码
- 方式和上面拉代码的方法一样,
- 第一次执行
fetch breakpad
- 然后切到
chrome_99
分支 - 然后执行
gclient sync
- 第一次执行
生成sln
- 进入到
\breakpad\src\src\client\windows
这个目录 - 执行下面的命令行
- 这里
vs2019
对应着后面的2017
- 这里
vs2022
对应着后面的2019
- 这里
1 |
gyp --no-circular-check breakpad_client.gyp -G msvs_version=2019 |
生成相关库
- 注意
4
个工程common
exception_handler
crash_generation_client
crash_generation_server
- 注意按需调整
C/C++
代码生成多线程调试模式MT
和MD
的匹配问题
- 注意,
server
编译不过,可以关掉把警告视为错误
使用
- 进程内写
dump
,不需要crash_generation_server
库,只需要crash_generation_client
、exception_handler
、common
- 进程外写
dump
就需要crash_generation_server
,也就是软件启动后是两个进程,一个是软件自己的进程,还有一个专门写dump
的进程,两个进程间通过pipe
(命名管道)通讯- 当软件崩溃时会把崩溃信息通过
pipe
发送到写dump
进程服务进行写入dump
文件
- 当软件崩溃时会把崩溃信息通过
编译minidump_stackwalk
概述
- 在程序崩溃生成
dump
后,需要minidump_stackwalk
和dump_syms
解析dump
文件,来分析具体那个线程下的崩溃位置调用堆栈 dump_syms
在项目中已经提供,在breakpad\src\tools\windows\binaries
下,minidump_stackwalk
需要我们自己编译
生成sln
- 生成
processor.sln
1 |
gyp --no-circular-check processor.gyp -G msvs_version=2019 |
- 可能需要移除
common
编译wingetopt库
minidump_dump
和minidump_stackwalk
中使用到了getopt
函数(unistd.h
包含getopt
声明),不过这个函数在windows
下没有直接实现- 在
windows
下需要用其他库(wingetopt
)实现
- 在
- https://github.com/alex85k/wingetopt
- 用
cmake
编译
其他问题
验证与集成
生成符号文件
1 2 |
# 使用编译生成的dump_syms工具 out/Default/dump_syms ./test_app > test_app.sym |
测试捕获奔溃
- 编译参数:需链接
-lbreakpad_client
并指定头文件路径
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include "client/linux/handler/exception_handler.h" // Linux示例 bool DumpCallback(const google_breakpad::MinidumpDescriptor& descriptor, void* context, bool succeeded) { printf("Dump生成路径: %s\n", descriptor.path()); return succeeded; } int main() { google_breakpad::MinidumpDescriptor descriptor("/tmp/crashes"); google_breakpad::ExceptionHandler eh(descriptor, nullptr, DumpCallback, nullptr, true, -1); // 触发崩溃测试 volatile int* ptr = nullptr; *ptr = 42; return 0; } |
分析Minidump
1 |
out/Default/minidump_stackwalk crash.dmp symbols/ > report.txt |
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ C++_指针引用09/19
- ♥ Python编程从入门到实践 一04/19
- ♥ Windows API11/11
- ♥ 打包_7z生成自解压打包exe07/11
- ♥ Windbg关于死锁的简单调试分析总结09/13
- ♥ C++编程规范101规则、准则与最佳实践 一01/05