crashpad 初始化失败主因是 handler 进程未启动或通信失败,需检查绝对路径、权限、sethandler 配置、调试器干扰、entitlements(macos)、日志输出及符号文件匹配等跨平台细节。

Crashpad 初始化失败:crashpad::ClientContext::StartHandler 返回 false 怎么办
初始化失败通常意味着 handler 进程没拉起来,或通信管道建立失败。不是代码写错了,而是环境或路径没配对。
-
handler可执行文件路径必须绝对有效,且有可执行权限(Linux/macOS)或签名合规(Windows);相对路径、空格、中文路径大概率失败 - 调用
crashpad::ClientContext::StartHandler前,确保crashpad::CrashpadClient::SetHandler已设好 handler 路径和参数,且 handler 二进制确实存在 - Windows 上若用 VS 调试器启动,
IsDebuggerPresent()为 true,Crashpad 默认不注册异常处理——加set_ignore_system_debugger(false)才能捕获 - macOS 需提前在 entitlements 文件里加
com.apple.security.get-task-allow,否则 sandbox 阻断进程派生
崩溃时没生成 minidump:检查 crashpad::CrashpadClient::StartHandler 的返回值和日志
Crashpad 不报错也不生成 dump,往往是因为 client 端根本没连上 handler,或者 handler 自己挂了。别只看 client 返回值,得查 handler 日志。
- 初始化时传入非空
log_file参数给StartHandler,比如"/tmp/crashpad_handler.log",handler 启动失败会写具体原因(如端口被占、无法绑定 socket) - 确保 handler 启动时带
--database参数,路径可写且父目录存在;若路径不存在或权限不足,handler 静默退出,client 看似成功实则失联 - Linux 下用
strace -e trace=connect,socket,execve跟一下 handler 进程是否真被 fork 出来,避免被 systemd 或沙箱拦截
如何让 Crashpad 捕获 C++ 异常(std::terminate)而不是只抓信号
默认 Crashpad 只监听 OS 信号(SIGSEGV、SIGABRT),C++ 异常未捕获导致的 std::terminate 不会触发 dump——得手动 hook。
- 在程序启动早期调用
std::set_terminate,在自定义 terminate handler 里调用crashpad::CrashpadClient::DumpWithoutCrash - 注意:不能直接在 terminate handler 里调用
abort()或触发新异常,否则栈已损坏;DumpWithoutCrash是安全的,它只读当前线程栈 - 若用
std::set_unexpected(C++17 已弃用),同样需配合DumpWithoutCrash,但现代代码基本不用 - Windows 上还要额外调用
SetUnhandledExceptionFilter补信号兜底,因为std::terminate可能最终转成EXCEPTION_ACCESS_VIOLATION
minidump 里看不到本地变量或源码行号:符号文件(.sym)没加载对
dump 文件本身不含调试信息,symbolication 靠外部 .sym 文件。生成和部署不匹配,就只能看到模块名和偏移量。
- 用
dump_syms工具从.exe/.so/.dylib提取符号,输出.sym文件;注意版本、build id、架构必须严格一致 - Crashpad handler 的
--symbols-path参数指定的是符号搜索根目录,不是单个 .sym 文件路径;.sym 必须按module_name/ID/module_name.sym结构存放 - Linux 下若用 strip 处理过二进制,原始 debug info 已丢,
dump_syms将无法生成完整符号——保留未 strip 的 binary 专门用于符号提取 - macOS 的 dSYM bundle 需先用
dsymutil和dump_syms转换,直接扔 dSYM 进 symbols-path 不生效
chmod +x,少一行 entitlements,少一个目录层级,dump 就静默消失。C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











