glog使用: 07-错误信号处理(Failure Signal Handler)

提供了一个方便的信号处理程序,当程序在某些信号(如SIGSEGV)上崩溃时,它将转储有用的信息。

信号处理程序可以通过 google::InstallFailureSignalHandler() 安装。以下是信号处理程序输出的示例:

cpp 复制代码
#include <iostream>

#include <glog/logging.h>

int main(int argc, char* argv[])
{
    (void)argc;//avoid unused warning
    google::InitGoogleLogging(argv[0]);

    // install failure signal handler
    google::InstallFailureSignalHandler();

    //模拟触发段错误
    *(int*)0 = 0;

    //后续不会执行,因为段错误导致程序崩溃
    LOG(FATAL) << "FATAL log message";

    return 0;
}

输出:

shell 复制代码
# ./demo
*** Aborted at 1758626944 (unix time) try "date -d @1758626944" if you are using GNU date ***
PC: @                0x0 (unknown)
*** SIGSEGV (@0x0) received by PID 57 (TID 0x743bde537e40) from PID 0; stack trace: ***
    @     0x743bdd036400 (unknown)
    @           0x400a8e main
    @     0x743bdd022555 __libc_start_main
    @           0x400999 (unknown)
    @                0x0 (unknown)
Segmentation fault (core dumped)

默认情况下,信号处理程序将故障转储写入标准错误。你可以通过 InstallFailureWriter() 自定义目标。

添加相关逻辑,有点怪,原来打印的SIGSEGV错误字样,哪里都找不见了,这不是画蛇添足么...

貌似这个还得建议搭配libunwind使用,等待后续有需要再探索吧。

cpp 复制代码
#include <iostream>
#include <string>

#include <glog/logging.h>

void FailureWriter(const char* data, size_t size)
{
    LOG(FATAL) << std::string(data,size);
}

int main(int argc, char* argv[])
{
    (void)argc;//avoid unused warning
    google::InitGoogleLogging(argv[0]);

    // install failure signal handler
    google::InstallFailureSignalHandler();

    //默认输出到标准错误,可以自定义一个函数来将错误输出到其他地方
    google::InstallFailureWriter(&FailureWriter);

    //模拟触发段错误
    *(int*)0 = 0;

    //后续不会执行,因为段错误导致程序崩溃
    LOG(FATAL) << "FATAL log message";

    return 0;
}

错误输出:

shell 复制代码
# ./demo
F20250923 19:39:11.574347    86 07.cpp:8] *** Aborted at 1758627551 (unix time) try "date -d @1758627551" if you are using GNU date ***
*** Check failure stack trace: ***
    @     0x7af9321d816a  google::LogMessage::Fail()
    @     0x7af9321d80ca  google::LogMessage::SendToLog()
    @     0x7af9321d7917  google::LogMessage::Flush()
    @     0x7af9321db104  google::LogMessageFatal::~LogMessageFatal()
    @           0x400e50  FailureWriter()
    @     0x7af9321e4575  google::(anonymous namespace)::DumpTimeInfo()
    @     0x7af9321e4a26  google::(anonymous namespace)::FailureSignalHandler()
    @     0x7af931236400  (unknown)
    @           0x400ebc  main
    @     0x7af931222555  __libc_start_main
    @           0x400cf9  (unknown)
    @              (nil)  (unknown)
Aborted (core dumped)

日志文件:

shell 复制代码
Log file created at: 2025/09/23 19:39:11
Running on machine: DESKTOP-RR46KEP
Running duration (h:mm:ss): 0:00:00
Log line format: [IWEF]yyyymmdd hh:mm:ss.uuuuuu threadid file:line] msg
F20250923 19:39:11.574347    86 07.cpp:8] *** Aborted at 1758627551 (unix time) try "date -d @1758627551" if you are using GNU date ***
相关推荐
cpp_250119 小时前
P1910 L 国的战斗之间谍
数据结构·c++·算法·题解·洛谷·背包dp
txzrxz19 小时前
c++深度搜索讲解及例题
开发语言·c++·深度搜索·例题讲解
|_⊙19 小时前
红黑树 (C++)
开发语言·c++·学习
楼田莉子19 小时前
同步/异步日志系统:工具类以及日志的简单模块
linux·服务器·数据结构·c++
王老师青少年编程19 小时前
动态规划之【树形DP】第4课:树形DP应用案例实践3
c++·动态规划·dp·树形dp·csp·信奥赛·提高组
corpse201019 小时前
VirtualBox 安装ubuntu-25 ,配置SSH工具登录
linux·ubuntu·ssh
她说彩礼65万19 小时前
C语言 整形提升及算数转换
linux·服务器·c语言
RenPenry19 小时前
2026 在Linux上搭建CS2插件服务器
linux·运维·服务器·cs2·debian13
七点半77019 小时前
FFmpeg C++ AI视觉开发核心手册 (整合版)适用场景:视频流接入、AI模型预处理(抽帧/缩放/格式转换)、高性能算法集成。
c++·人工智能·ffmpeg
Deitymoon20 小时前
linux——TCP编程
linux·服务器