You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Python调用的C++程序崩溃错误写入文件?

如何捕获程序崩溃时的Shell提示信息到文件

这个问题的核心原因很关键:你看到的Floating point exception不是你的C++程序输出的——它是运行程序的shell(比如bash)在检测到你的进程因为SIGFPE信号崩溃后,打印的提示文本。这个文本直接输出到shell自己的标准错误流,而不是你程序的stderr,所以单纯重定向程序的stdout/stderr是抓不到它的。

下面给你两种最实用的解决思路:

方法1:重定向Shell的错误输出

如果你不想修改代码,只需要调整命令行的重定向方式,把shell的stderr也捕获到文件里。可以用子shell来隔离程序的输出和shell的输出:

# 程序的stdout进stdout文件,stderr进stderr文件;shell的崩溃提示进crash.log
(./test 1>stdout 2>stderr) 2>crash.log

或者如果你想把所有内容(程序输出+崩溃提示)都放到同一个文件里,可以直接把整个命令的所有输出重定向:

# 程序的stdout/stderr和shell的崩溃提示都进all_output.log
./test >all_output.log 2>&1

方法2:在程序内处理崩溃信号

如果希望崩溃信息由程序自己输出(这样能更灵活地控制内容),可以给程序添加信号处理函数,捕获SIGFPE(浮点异常对应的信号)并输出到stderr。

注意:信号处理函数里要使用异步信号安全的函数,C++的cout/cerr并不属于这类函数,所以更安全的方式是用系统调用write直接写入标准错误:

#include <iostream>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

using namespace std;

void sig_fpe_handler(int signum) {
    // 用write直接写stderr,保证信号安全
    const char* error_msg = "Floating point exception (SIGFPE)\n";
    write(STDERR_FILENO, error_msg, strlen(error_msg));
    exit(EXIT_FAILURE);
}

int main() {
    // 注册SIGFPE信号的处理函数
    if (signal(SIGFPE, sig_fpe_handler) == SIG_ERR) {
        cerr << "Failed to set signal handler" << endl;
        return 1;
    }

    cout << "cout" << endl;
    cerr << "cerr" << endl;
    cout << 1/0 << endl; // 触发浮点异常
    return 0;
}

编译运行后,再用./test 1>stdout 2>stderr,崩溃信息就会被写入stderr文件里了。

另外补充:除了SIGFPE,常见的崩溃信号还有SIGSEGV(段错误)、SIGABRT(abort调用触发)等,如果需要处理更多崩溃场景,可以给这些信号也注册处理函数。

内容的提问来源于stack exchange,提问作者yketa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 21:27:52