breakpad 编译报错找不到 exception_handler.h 是因未将 breakpad/src 加入头文件搜索路径;linux 下 handler 构造失败主因是 dump_path 不可写或 ptrace 权限受限;windows 冲突源于 setunhandledexceptionfilter 覆盖,应优先初始化 breakpad 或改用 addvectoredexceptionhandler;dump_syms 输出为空表明目标文件缺失调试符号。

Breakpad 编译时为啥 client/linux/handler/exception_handler.h 找不到
因为 Breakpad 默认不提供预编译头文件,你直接 #include 它却没把源码树根目录加进 include path。官方推荐做法是把整个 breakpad/src 当作系统级头路径(比如用 -I/path/to/breakpad/src),而不是只加某一层子目录。
- 确认你 clone 的是完整仓库(含
src/目录),不是仅下载 release zip —— 后者常缺构建脚本和部分头文件 - CMake 项目中,用
include_directories(${BREAKPAD_SRC_DIR}),别写成${BREAKPAD_SRC_DIR}/client - 如果你用 GN/Ninja 构建(如 Chromium 环境),
exception_handler.h实际依赖common/linux/eintr_wrapper.h等底层头,路径缺失会连带报一堆“未定义”错误
Linux 下 ExceptionHandler 构造失败返回 false 怎么查
最常见原因是 minidump 写入路径不可写,或父目录不存在;其次是 seccomp-bpf、ptrace 权限被限制(尤其容器或 systemd service 中)。
- 构造时传入的
dump_path必须是绝对路径,且进程有写权限;建议先用access(dump_path, W_OK)验证 - 检查是否被
prctl(PR_SET_DUMPABLE, 0)关闭了 core dump 权限 —— Breakpad 依赖 ptrace,同样受此影响 - systemd 服务需显式加
ProtectSystem=false和ReadWritePaths=/your/dump/dir,否则/tmp可能被挂载为 tmpfs 或只读 - 不要在
fork()后、exec()前初始化 Handler —— 子进程可能没继承足够权限
Windows 上 SetUnhandledExceptionFilter 和 Breakpad 冲突怎么办
Breakpad 在 Windows 使用 SetUnhandledExceptionFilter 注册顶层异常处理器,如果你代码里也调了它,旧 handler 会被覆盖,导致崩溃不上报。
- 务必让 Breakpad 的
ExceptionHandler实例构造早于任何其他异常过滤器注册 - 避免手动调用
SetUnhandledExceptionFilter;如有遗留逻辑,改用AddVectoredExceptionHandler(TRUE, ...)—— 它与 Breakpad 共存(但注意调用顺序仍影响触发优先级) - MSVC 调试器下(F5 启动)Breakpad 默认不生效,因为调试器会先截获异常;需在项目属性 → Debugging → “Debugger to launch” 改为 “Native Only”,或用 Release 模式测试
上报 minidump 后符号没解析,dump_syms 输出为空
dump_syms 不是读取运行时内存,而是解析可执行文件或 so 的 debug info(DWARF / PDB)。如果输出空,说明目标文件压根没带调试符号。
- Linux:链接时加
-g,且**不能**加-s或strip;发布包可分离符号:objcopy --only-keep-debug myapp myapp.debug,再用dump_syms myapp.debug > myapp.sym - macOS:确保 Xcode Build Setting 中
DEBUG_INFORMATION_FORMAT = dwarf-with-dsym,并关闭STRIP_INSTALLED_PRODUCT - Windows:编译时开
/Zi,链接加/DEBUG;生成的.pdb文件必须和 exe 在同一目录供dump_syms.exe读取 -
dump_syms输出首行是模块标识(如MODULE Linux x86_64 ...),若无此行,基本可断定输入文件无有效 debug info
符号解析这步最容易卡在构建流程里——debug info 被 strip 掉、PDB 路径错配、或者 dump_syms 版本和目标平台不匹配(比如用 x86_64 的工具解析 arm64 的 so),这些细节不报错,只静默失败。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











