6

stderrへの有用な出力とstdoutへのほとんどのノイズ(デバッグしている場合を除く)を生成するC ++ユニットテストがあるので、stdoutを/ dev/nullにリダイレクトしたいと思います。

不思議なことに、これを行うとセグメンテーション違反が発生するようです。

コードが">/dev / null"でセグメンテーション違反を起こし、それ以外の場合は正常に実行される理由はありますか?

printfベアリングがある場合、出力は完全にsによって生成されます。

問題のあるコードは、公開のために提出されている研究であるため、投稿するのは困難です。この説明に基づいて、「明らかな」考えられる原因があることを願っています。

事後分析

セグメンテーション違反は次のようなコードによって引き起こされていました:

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

C / C ++でが負のx % y場合、それが負のままであることを何度も忘れました。x

さて、なぜ私がにリダイレクトしたときにのみそれが起こったの/dev/nullですか?私の推測では、アクセスしていた無効なメモリアドレスはstdoutの出力バッファにあり、このバッファは必要のないときに割り当てられません。

良い答えをありがとう!

4

3 に答える 3

6

これはあなたの質問に正確に答えるわけではありませんが、答えることはできます。gdbを使用してみましたか?これは、segfaultが発生している場所を見つけることができるコマンドラインデバッグツールです。使い方はかなり簡単です。これは、その使用方法に関するかなり詳細なチュートリアルです。

于 2009-10-11T05:47:19.067 に答える
4

標準出力が/dev/ nullにリダイレクトされるときに、I/Oがコアダンプをトリガーする「通常の」理由はありません。

おそらく、標準出力に送信されたときではなく、/ dev / nullに送信されたときにコアダンプをトリガーする、漂遊ポインタまたはバッファオーバーフローがありますが、コードがないと問題を特定するのは困難です。

標準出力に有用な情報を、標準誤差にノイズを置くのが一般的です。

于 2009-10-11T05:45:17.857 に答える
1

何かが「isatty」をチェックしている可能性があります。これにより、の動作が異なる可能性があります/dev/null

stdoutから何かが読み取られている可能性がありますが、これは失敗し/dev/nullます。

于 2009-10-11T05:46:15.403 に答える