代码之家  ›  专栏  ›  技术社区  ›  Tyler

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

  •  4
  • Tyler  · 技术社区  · 15 年前

    我有一个C++单元测试,它对STDRR产生有用的输出,并且大部分是噪声(除非我正在调试)到STDUT,所以我想重定向STDUT到/DEV/NULL。

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

    是否有任何原因导致代码可能与“>/dev/null”发生SEG故障,否则运行正常?

    输出完全由 printf S,如果有任何影响的话。

    对我来说,很难发布违规代码,因为这是一个正在提交出版的研究。我希望有一个“明显的”可能的原因基于这个描述。

    验尸

    SegFault是由以下代码引起的:

    ArrayElt* array = AllocateArrayOfSize(array_size);
    int index = GetIndex(..) % array_size;
    ArrayElt elt = array[index];
    

    无数次,我忘记了 x % y x 在C/C++中是否定的。

    好吧,那为什么只有当我重定向到 /dev/null 是吗?我的猜测是,我访问的无效内存地址在stdout的输出缓冲区中,而这个缓冲区在不需要时不会被分配。

    谢谢你的回答!

    3 回复  |  直到 15 年前
        1
  •  3
  •   Jonathan Leffler    15 年前

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

    最可能的情况是,当发送到/dev/null而不是发送到标准输出时,您有一个偏离的指针或缓冲区溢出触发核心转储,但是如果没有代码,很难发现问题所在。

    通常情况下,标准输出的有用信息和标准误差的噪声信息是一致的。

        2
  •  6
  •   Kredns    15 年前

    这并不能完全回答你的问题,但它可以。你试过用吗 gdb 是吗?它是一个命令行调试工具,可以找到哪里发生了segfaults。它相当容易使用。 Here is a pretty in-depth tutorial on how to use it.

        3
  •  1
  •   Martin v. Löwis    15 年前

    可能是有什么东西在检查“isatty”,这可能导致 /dev/null .

    可能是什么东西 阅读 从stdout,它将失败 /DEV/NULL .