如何从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
相关产品推荐
相关产品推荐

