1

次の場合、数値コードのデバッグを開始するための一般的な戦略は何ですか?

  • 積極的な最適化フラグを使用してコンパイルされたコードは、出力に時折 NaN と Inf を生成します。
  • -gデバッガーで実行するために(これは を意味する) でコンパイルされたコードは-O0、NaN と Inf をもう生成しませんか?

この場合、ポートランド グループの C++ コンパイラである pgCC を使用し、最適化オプションを使用しました。

-w -fast -O3 -Mipa=fast -Mfprelaxed -Minline=levels:10

そしてちょうど

-w -g

デバッグ バージョン用。しかし、同様の状況が同様に発生する可能性があると確信しg++ています。

編集: print ステートメントを追加することはあまり魅力的なオプションではありません。コードは私が書いたものではなく、数千行もあり、検索を絞り込む方法がわかりません。NaN はどこからでも発生する可能性があります。

4

3 に答える 3

3

here のように浮動小数点例外を有効にできるかどうかを確認してから、いくつかのシグナリング nan から例外がスローされるかどうかを確認します。これらの例外を有効にするコンパイラ フラグがコンパイラにある可能性があります。

それがなければ、手動でバイナリ検索を行います。つまり、すべての変数をダンプする関数を作成します。次に、コード行ごとではなく、実際に実行される内容ごとにプログラムを半分に分割し、分離します。言い換えれば、袖をまくり上げてそこに入る.

編集:私が提供したリンクは非常にWin32固有のものであるため、これはあなたのケースには当てはまらない場合があります。しかし、おそらくそれはあなたにいくつかの手がかりを与えるでしょう。または、無料の MS コンパイラでコードを試すことができますか?

于 2012-04-13T13:46:51.940 に答える
2

Portland Groupコンパイラは、ディレクティブに付随するいくつかのオプションを提供します- Mfprelaxed; これらを1つずつ設定して、どれが違いを生むかを確認してみます。このディレクティブをコンパイルから完全に削除したい場合があります。

于 2012-04-13T14:14:07.737 に答える
2

g++ の場合、-g フラグは最適化を抑制しない (つまり、-O0 を意味しない) ことを指摘しておきます。デバッグ情報を含む最適化された実行可能ファイルはデバッグが困難ですが、デバッグは可能です。

于 2012-04-13T18:25:01.697 に答える