デバッグモードでバグが現れるまでに1時間以上かかる場合があります(リリースモードでも20分以上かかります)。原因が疑われるコードの領域でブレークポイントに到達するまでの待機時間を短縮するのに役立つデバッグ戦略を知っていますか?
プログラムで機能をスキップするかどうかを確認するために、ログを記録してダイアログを表示することを試みました。
理想的には、バグのあるセクションの直前(信じているところ)にプロセスの状態を保存し、その時点からデバッグしたいと思います。これは可能だとは思いません。
Visual Studioを使用するWindowsでC++を使用しています。一般的なソリューションを歓迎します。
部分的な計算を保存することは可能ですか?もしそうなら、あなたはあなたが良いとわかっている一連の計算を保存し、その後、将来のセッション中にそれらをリロードし、そこからデバッグを続けることができます。
テストが再現可能である場合、フロバズの99番目の配列の1,058番目の要素が常に間違っているような場合、そのメモリ位置にウォッチポイントを配置して、計算を開始できます。計算が遅いため、コードを手動で調べて、目立つものがないかどうかを確認できます。最終的には、その要素が変更されると停止します。そこから通常、悪い入力がどこから来ているのかを確認できます。 (おそらく別の悪い要素を使った計算なので、that要素を使ってもう一度試すことができます。)
また、コードで静的アナライザーを実行することを強くお勧めします。気づかなかったコードの問題を指摘し、エラーの原因を指摘することもできます。 valgrind、アドレス消毒剤などの他のツールもこの点で役立ちます。
編集ある方法で「マシンをフリーズ」できることに気づきました。仮想マシンがある場合は、アプリを起動して、デバッグを開始するポイントまで計算を実行できます。 VMの状態を保存します。デバッグを行います。その状態に戻したい場合は、VMを保存した場所に復元し、デバッグを再開します。もちろん、コードを変更した場合は、計算を再度実行する必要があります。デバッグしたいポイント。
原因を含むことが疑われるコードの領域でブレークポイントに到達するまでの待機時間を短縮するのに役立つデバッグ戦略を知っていますか?
デバッグ関数のプロファイルを引き続き作成できます。特にバグの修正に時間をかけすぎないようにしますが、デバッグに30%以上の時間を要する明白なホットスポットがあり、ソリューションが非常にシンプルである場合、それは本当のことになるかもしれません開発者がデバッグビルドを待って何かを行うのに30分以上費やすことに慣れていて、バグをより早く修正するのに役立つ場合、生産性の違い。
私の場合、リリース/プロダクションビルドで見事に実行されたマトリックス/ベクトルライブラリが1回ありましたが、デバッグビルドで境界外などに配列にアクセスしていないことを確認するために、あちこちにアサーションを散りばめました。私はそこに全体的なホットスポットを見つけ(場所全体でasserts
が原因でそのような関数に費やされた時間の50%以上など)、それらの関数が適切に動作し、それらのみを作成することを確認する単体テストを作成しましたasserts
は、DEBUG_MATH_LIB
(私が何と呼んだか忘れてしまいました。これは何年も前のことです)が定義されたときに適用されました。これは、実際にソフトウェアをデバッグモードで実行する際に、完全な拷問からデバッガで問題を再現するのに耐えられないほど大幅にスピードアップしました(デバッグはリリースよりもおそらく20倍遅くなりますが、200倍遅くはありません)。
不完全な出力(またはクラッシュなど)を引き起こし、時間がかかるバグを再現しようとしている場合、通常、私がその多くに対処するために使用していたときに当てはまる場合の一番のテクニックは、 「バイナリ検索」の考え方で、もともとはリリースビルドにあります(デバッガーは実行していません)。
コンテンツ全体の半分を削除してから、コンテンツの半分をロードしてみて、グリッチが発生するかどうかを確認します。表示されない場合は、残りの半分を試してみると、不具合が発生しています。次に、問題の読み込みと再現にわずか数秒かかるまで、その後半を4分の1などに分割します。その後、この問題の再現に非常に時間がかかる主な問題が解決され、残りは、再現を待機するというボトルネックがなければ、デバッグするという苦痛なプロセスです。そういうことをやらなければならないのは久しぶりですが(大体このようなものを避けたデザインを見つけました)、過去のぼんやりとした思い出がこれをたくさんやっていると思います。
ほとんどの場合、問題を再現するために3ギガバイトのデータをロードする必要はありません。私の最初のステップは、問題を理解することではありませんが、その「バイナリ検索」の考え方で再現するのを速くし、データが非常に小さくなって瞬きで読み込まれて問題が発生するまでデータを半分にします。次に、「デバッグモード」を実行します。データの絞り込みにより、ソフトウェアの動作に問題がある可能性のある部分がより明確になる傾向もあります。
理想的には、バグのあるセクションの直前(信じているところ)にプロセスの状態を保存し、その時点からデバッグしたいと考えています。これは可能だとは思いません。
少なくともWindowsでは、実行中のプロセスを右クリックしてダンプファイルを出力できます。
次に、結果の.DMP
ファイルをVisual Studioなどで開いて、デバッグすることができます。
残念ながら、私の知識でプロセスを再開して終了させることはできません(通常、ダンプを作成することは、ソフトウェアがクラッシュしたときにのみ私にとって役に立ちます)。ただし、スタックダンプを保存して内容を検査し、戻ってそれらをもう少し見ることができる方法の1つとなる場合があります。