不能。glog仅通过InstallFailureSignalHandler在崩溃信号时输出日志并退出,不生成minidump或core dump;需手动集成dbghelp(Windows)或breakpad/crashpad,并禁用glog自带信号处理器以避免冲突。

glog 能不能直接捕获崩溃并生成 Dump?
不能。glog 本身不提供崩溃捕获或生成 minidump/core dump 的能力,它只是日志输出库。你看到的“崩溃时打日志”,其实是靠 google::InstallFailureSignalHandler() 或 google::InstallFailureHandler() 注册信号处理器,在 SIGSEGV、SIGABRT 等信号触发时,调用 LOG(FATAL) 输出最后几条日志并退出——但不会保存内存快照。
怎么让程序崩溃时生成 Windows Minidump?
需要手动集成 Windows API(dbghelp.h)或使用 breakpad/crashpad。glog 只负责配合:在信号处理函数里先调用 MiniDumpWriteDump(),再交由 glog 打印日志。关键步骤:
- 链接
dbghelp.lib,包含<dbghelp.h> - 在
main()开头调用SetUnhandledExceptionFilter()注册自定义异常过滤器 - 在过滤器函数中:打开文件句柄 → 调用
MiniDumpWriteDump()→ 再调用google::LogMessage(..., FATAL).stream()避免被 glog 自带的 signal handler 重复拦截 - 禁用 glog 自带的崩溃处理:编译前定义
GLOG_NO_ABBREVIATED_SEVERITIES,并在初始化后调用google::InstallFailureSignalHandler()之前,先调用google::DisableLogSinkForFatal()(若版本支持),或更稳妥地——**完全不调用google::InstallFailureSignalHandler()**
Linux 下怎么生成 core dump 并关联 glog 日志?
Linux 不依赖 glog 生成 core,而是靠系统机制。重点是让 glog 日志和 core dump 在时间/上下文上对得上:
- 确保
ulimit -c unlimited已设置,或写入/proc/sys/kernel/core_pattern - 在程序启动时调用
google::SetLogSymlink("INFO", "latest_info")等,让日志有稳定入口 - 崩溃前最后一行
LOG(INFO)或LOG(WARNING)应包含可定位的上下文(如当前线程 ID、正在处理的请求 ID) - 用
google::SetStackLogging(true)开启栈日志(注意性能开销),或在关键位置手动打LOG(INFO) - 避免在信号处理函数里调用
malloc、std::string构造等非 async-signal-safe 操作——glog 的LOG(FATAL)内部是安全的,但你自己加的逻辑未必
为什么崩溃时 glog 日志经常“少几行”或“没刷出来”?
因为默认日志是行缓冲或全缓冲的,崩溃瞬间 stdout/stderr 可能还卡在用户态缓冲区里。必须显式刷新:
立即学习“C++免费学习笔记(深入)”;
- 初始化时调用
google::SetLogFilenameExtension("log")并确保输出到文件(而非终端),文件流默认全缓冲但LOG宏内部会fflush - 如果非要输出到终端,启动时加参数
--logtostderr=1 --alsologtostderr=1,并确认终端未重定向;或者调用setvbuf(stdout, nullptr, _IONBF, 0)关闭 stdout 缓冲(仅限调试) -
LOG(FATAL)会强制 flush,但前面的LOG(INFO)不会——所以关键路径上要用LOG(INFO) - 多线程下,不同线程日志可能交错或丢失,建议用
google::SetLogFilenameExtension(std::to_string(getpid()))按进程隔离日志文件
真正稳定的崩溃诊断,从来不是靠“glog 多打几行”,而是 core/minidump + 符号表 + 日志上下文三者对齐。glog 做好它该做的:把你知道的信息,及时、不丢、可追溯地落盘。


















