我有一个C ++单元测试,它会向stderr产生有用的输出,主要是噪声(除非我正在调试)到stdout,所以我想将stdout重定向到/ dev / null。
奇怪的是,这样做似乎会导致分段错误。
有没有理由为什么代码可以用“> / dev / null”来判断错误,否则运行正常?
输出完全由printf
生成,如果有任何影响的话。
我很难发布违规代码,因为它是提交出版的研究。我希望基于这种描述有一个“显而易见”的可能原因。
段错由这样的代码引起:
ArrayElt* array = AllocateArrayOfSize(array_size);
int index = GetIndex(..) % array_size;
ArrayElt elt = array[index];
无数次,我忘记了当x % y
在C / C ++中为负时x
仍为负数。
好的,那么为什么只有在我重定向到/dev/null
时才会发生?我的猜测是我访问的无效内存地址是stdout的输出缓冲区 - 并且在不需要时不分配此缓冲区。
感谢您的好答案!
答案 0 :(得分:6)
这并不能完全回答你的问题,但可以。您是否尝试过使用gdb?它是一个命令行调试工具,可以找到发生段错误的位置。它相当容易使用。 Here is a pretty in-depth tutorial on how to use it.
答案 1 :(得分:3)
当标准输出重定向到/ dev / null时,stdout的I / O没有“正常”原因触发核心转储。
你很可能有一个杂散指针或缓冲区溢出,当发送到/ dev / null时触发核心转储,而不是在发送到标准输出时 - 但是没有代码就很难发现问题。
传统的做法是将有用信息放在标准输出上,将噪声放在标准误差上。
答案 2 :(得分:1)
可能是某些内容正在检查“isatty”,这可能会导致/dev/null
的行为不同。
可能是来自stdout的某些内容正在阅读,/dev/null
会失败。