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

如何从Docker获取正确的stderr输出?解决C++运行时错误捕获问题

问题描述

尝试使用Python的Docker库在容器内执行一段存在除零运行时错误的C++脚本:

#include <iostream>

int main() {
    int a = 1;
    int b = 0;
    std::cout << a / b;
    return 0;
}

编译步骤正常:

container.exec_run('g++ user-scripts-dir/cpp_script.cpp -o compiled')

执行代码如下:

result = container.exec_run('./compiled', demux=True)
print(result)

开启demux=True后本应分离返回stdout和stderr,但实际仅得到ExecResult(exit_code=136, output=(None, None))。手动在容器内执行编译后的文件时,能正常看到Floating point exception的错误提示,请问如何通过container.exec_run正确获取该stderr错误信息?

解决方案

问题核心是:除零触发的Floating point exception(SIGFPE信号)并非由程序本身输出到stderr,而是由shell在监控到子进程因信号崩溃时打印的。直接执行二进制文件时无shell介入,自然不会生成这条错误输出。

可以通过以下两种方式解决:

  • 方式1:通过shell执行二进制文件
    在exec_run中启用shell模式,或者显式调用shell执行程序,让shell捕获信号并输出错误信息:

    # 方法A:启用shell参数
    result = container.exec_run('./compiled', demux=True, shell=True)
    # 方法B:显式调用bash执行
    result = container.exec_run('bash -c "./compiled"', demux=True)
    print(result)
    

    此时stderr会捕获到Floating point exception的错误信息。

  • 方式2:修改C++代码捕获信号
    若不想依赖shell,可在C++代码中手动捕获SIGFPE信号并输出错误信息,示例如下:

    #include <iostream>
    #include <signal.h>
    #include <stdlib.h>
    
    void handle_sigfpe(int signum) {
        std::cerr << "Floating point exception (divide by zero)" << std::endl;
        exit(EXIT_FAILURE);
    }
    
    int main() {
        signal(SIGFPE, handle_sigfpe);
        int a = 1;
        int b = 0;
        std::cout << a / b;
        return 0;
    }
    

    重新编译后,直接执行二进制文件就能在stderr中得到自定义的错误信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 07:55:09