linux 环境下 c++ 程序打印 core dump 信息

linux 信号机制

软中断信号 Signal,简称信号,用来通知进程发生了异步事件,进程之间可以互相通过系统调用 kill 等函数来发送软中断信号。内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。

进程对信号的处理

进程对信号的处理有三种方式:

忽略信号: 大部分信号可被忽略,除SIGSTOP和SIGKILL信号外(这是超级用户杀掉或停掉任意进程的手段)。

捕获信号: 注册信号处理函数,它对产生的特定信号做处理。

信号默认动作: unix内核定义的默认动作,有5种情况:
a) 流产abort:终止进程并产生core文件。
b) 终止stop:终止进程但不生成core文件。
c) 忽略:忽略信号。
d) 挂起suspend:挂起进程。
e) 继续continue:若进程是挂起的,则resume进程,否则忽略此信号。

捕获进程退出信号

当程序由于某种原因要退出时,系统也会给进程发送信号。
此时,如果没有对信号进行捕获,进程就会执行默认退出动作。
当软件在客户环境运行时,为了方便 debug, 可以在程序异常退出时,打印程序当前的堆栈信息

下面五种都是进程退出信号。

// 捕获信号,对于这些信号都执行 coreDumpHandle
signal(SIGQUIT, coreDumpHandle);
signal(SIGILL, coreDumpHandle);
signal(SIGABRT, coreDumpHandle);
signal(SIGSEGV, coreDumpHandle);
signal(SIGTRAP, coreDumpHandle);

可以通过在终端执行 man 7 signal 查看各种信号的说明

c++ 打印堆栈信息

#include <signal.h>
#include <execinfo.h>
#include <dlfcn.h>
#include <cxxabi.h>
#include <QFile>
#include <QTextStream>

void coreDumpHandle(int signum) {
    string path = "/xxx/xxx/coreDump.log";

    void* callStack[128];
    int frames = backstrace(callStack, sizeof(callStack) / sizeof(callStack[0]));
    char** strs = backtrack_symbols(callStack, frames);

    if (strs == nullptr)
        exit(0);

    QFile out(path.c_str());
    if (!out.open(QIODevice::WrietOnly | QIODevece::Text | QIODevice::Truncate)) {
        exit(0);
    }

    QTextStream textStream(&out);
    textStream << "Get signal: " << strsignal(signum) << "\n";
    textStream << "Call stack:\n";

    unsigned count = 0;
    for (int i = 0; i < frames; ++i) {
        Dl_info info;
        if (dladdr(callStack[i], &info) && info.dli_sname) {
            int status;
            char* demangled = abi::__cxa_demangle(info.dli_sname, nullptr, nullptr, &status);
            if (status == 0) {
                QString str = QString("[%1] %2 : %3 0x%4\n").arg(count++)
                        .arg(info.dli_fname)
                        .arg(demangled)
                        .arg(reinterpret_cast<quintptr>(((void*)callStack[i])), 0, 16);
                textStream << str;
            } else {
                QString str = QString("[%1] %2 : %3 0x%4\n").arg(count++)
                        .arg(info.dli_fname)
                        .arg(info.dli_fname)
                        .arg(reinterpret_cast<quintptr>(((void*)callStack[i])), 0, 16);
                textStream << str;
            }
            free(demangled);
        }
        else {
            // printf("[%d] %s : ???\n", i, info.dli_fname);
        }
    }
    out.close();
    free(strs);
    exit(0);
}
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇