仅当我将stdout重定向到/ dev/null时才出现分段错误?

Tyl*_*ler 4 c++ redirect stdout segmentation-fault

我有一个C++单元测试,它产生stderr的有用输出,主要是噪声(除非我正在调试)到stdout,所以我想将stdout重定向到/ dev/null.

奇怪的是,这样做似乎会导致分段错误.

是否有任何理由为什么代码可能会出现">/dev/null"错误,否则运行正常?

printf如果有任何方位,输出完全由s 产生.

我很难发布有问题的代码,因为它是提交出版的研究.我希望基于这种描述有一个"明显的"可能的原因.

验尸

段错由这样的代码引起:

ArrayElt* array = AllocateArrayOfSize(array_size);
int index = GetIndex(..) % array_size;
ArrayElt elt = array[index];
Run Code Online (Sandbox Code Playgroud)

无数次,我忘记了x % yxC/C++中为负数时仍为负数.

好的,那么为什么只有在我重定向时才会发生/dev/null?我的猜测是我访问的无效内存地址是stdout的输出缓冲区 - 并且在不需要时不分配此缓冲区.

谢谢你的好答案!

Kre*_*dns 6

这并不完全回答你的问题,但它可以.你尝试过使用gdb吗?它是一个命令行调试工具,可以找到发生段错误的位置.它相当容易使用.这是一个关于如何使用它的非常深入的教程.

  • @Tyler:在命令行上检查`gdb`:`gdb./ my_binary`中运行的选项(或者如果有的话,添加核心转储的名称),然后使用'run>/dev /运行程序空值'. (2认同)

Jon*_*ler 4

当标准输出重定向到 /dev/null 时,stdout 的 I/O 没有“正常”原因触发核心转储。

您很可能有一个流浪指针或缓冲区溢出,当发送到 /dev/null 时触发核心转储,而不是发送到标准输出时触发核心转储 - 但如果没有代码,将很难发现问题。

通常将有用信息放在标准输出上,将噪声放在标准错误上。