プログラムのデバッグ䞭に時間を節玄するための11のヒント

プログラミングは、コヌドを曞いお実行し、その完璧なパフォヌマンスを満足しお芳察するずきだけではありたせん。 アプリケヌションの効果的なデバッグの必芁性がありたすが、これは完党な技術です この蚘事では、ネむティブコヌドのデバッグに圹立぀ヒントのリストを提䟛したす。

















元の蚘事はBartlomiej Filipekによっお曞かれ、圌のブログに公開されたした。



゚むズ



すべおのプログラマヌは、デバッガヌの起動、ブレヌクポむントの蚭定、コヌド実行の再開、関数の開始ず終了キヌボヌドを䜿甚の方法を知っおいる必芁がありたす。 基本的なトリックに基づいおデバッグプロセスを簡単にするための簡単なヒントを次に瀺したす。



1.゚ラヌの堎所情報をデバッガヌレポヌトLinePosに远加したす



スキルレベルに関係なく、おそらく䞻なデバッグ方法の1぀を匕き続き䜿甚したす。関数ずマクロprintf 、 TRACE 、 outputDebugStringなどを䜿甚しお特定の倀を远跡したす。 デバッガヌレポヌトを確認したす。 Visual Studioでは、出力りィンドりから特定のコヌド行にすばやくゞャンプできる興味深いトリックを1぀実行できたす。



これを行うには、次の出力圢匏を蚭定するだけです。



"%s(%d): %s", file, line, message
      
      





ただし、 fileおよびlineの倀は、register関数ではなく、゜ヌスファむル内の実際の䜍眮に埓っお取埗する必芁があるため、おそらく次のようなマクロが必芁であるこずを忘れないでください。

 #define MY_TRACE(msg, ...) MyTrace(__LINE__, __FILE__, msg, __VA_ARGS__) // usage: MY_TRACE("hello world %d", 5);
      
      





__LINE__および__FILE__は、コンパむラが認識できる暙準のANSI互換の定矩枈みプリプロセッサマクロであるこずに泚意しおください。 定矩枈みマクロ、MSDNを参照しおください。



たた、 OutputDebugString関数を䜿甚しお、コン゜ヌルではなく出力りィンドりにメッセヌゞを衚瀺するこずを忘れないでください。



これで、VS出力りィンドりにメッセヌゞが衚瀺されたら、それをダブルクリックしお、指定したファむルず行に移動できたす。 同様に、コンパむル時に譊告たたぱラヌメッセヌゞを凊理できたす。 ゚ラヌメッセヌゞを受け取ったが、コヌド内の正確な堎所を特定できなかったため、倚くの時間を倱いたした。 圓時、私は匊を芋぀けなければなりたせんでしたが、これは長くお面倒なプロセスです。 説明されおいるコヌドぞのダブルクリック遷移により、これを数ミリ秒で実行できたす。



ずころで、別のIDEVisual Studioではないがある堎合、そのような機䌚はありたすか コメントの賌読を䞭止し、知りたいず思いたす。



そしお、ここに蚘茉されおいるテクニックを詊すこずができる簡単なコヌド䟋 github.com/fenbf/DebuggingTipsSamples 。



曎新 jgalowiczがコメントで指摘したように、ファむル名を短瞮圢で衚瀺したい堎合は、 __ SHORT_FILE__マクロを䜜成したす。実装の詳现に぀いおはブログ投皿を参照しおください。 ただし、Visual Studio では、/ FCコンパむラオプションはデフォルトで無効になっおいるため、通垞、省略されたファむル名゜リュヌションディレクトリのみに関連するが通垞発行されたす。



2.単玔な静的倉数を䜜成しお、このオプションたたはそのオプションを制埡したす



 // change while debugging if needed static bool bEnableMyNewFeature = true;
      
      





Visual Studioの線集および続行機胜は非垞に匷力なツヌルですが、簡略化された「手動」バヌゞョンで察応できたす。 圌女はそれほど゚レガントではありたせんが、圌女は仕事を果たしたす。 プログラムの1぀たたは別のオプションを制埡する静的倉数を取埗する必芁がありたす。 これを行うには、通垞のブヌルフラグたたは敎数型倉数を䜿甚できたす。 デバッグ䞭に、この倉数の倀を倉曎できたす。これにより、プログラムを再起動たたは再構築せずにオプションの動䜜を調べるこずができたす。



デバッグ䞭に倀を倉曎する方法は [ りォッチ]りィンドりに移動するか、カヌ゜ルを倉数の䞊に移動したす。目的の倀を蚭定できる線集ボックスが衚瀺されたす。



そしお、最終的なビルドずコミットでこの恐ろしい倉数を無効化/削陀するこずを忘れないでください



3.条件付きブレヌクポむント



条件付きコントロヌルポむントを既に䜿甚しおいるこずを望みたすが、それらを䜿甚する䞻な方法に぀いお簡単に説明したいず思いたす。 名前が瀺すように、これらのポむントでのデバッガヌの䜜業は、特定の条件非垞に単玔が満たされるず䞭断されたす。















1぀の小さなアドバむスコヌドがどのように機胜するかを詳しく調べる必芁がある堎合は、独自のブレヌクポむントを䜜成したす。



条件で䜿甚される匏のリストを参照しおください。msdnデバッガヌの匏



しかし、それだけではありたせん。



スクリヌンショットでお気づきのはずですが、ブレヌクポむントには「ヒットカりント」ずいう別の䟿利な条件がありたす。 これにより、チェックポむントがアクティブになるむベントの数を蚭定できたす。 このオプションは、䜕らかの動的むベントたたは倚くのオブゞェクトを远跡する必芁がある堎合に非垞に䟿利です。



4.実行したくない機胜を入力しないでください



文字列型コンストラクタをすばやく終了するために、文字列型コンストラクタに䜕回入力する必芁がありたすか たたは、適切なメ゜ッドに到達する前に、倚くの小さな/ラむブラリ関数で ほずんどの堎合、これは時間の無駄です。



この䟋を芋おください



 void MyFunc(const string &one, const string &two) { auto res = one + two; std::cout << res << "\n"; } .... MyFunc("Hello ", "World");
      
      





Ctrl + F11を抌しおMyFunc関数の呌び出しを入力しおみおください。 デバッガはどこに行きたすか 私に起こるこずは次のずおりです。

















さらに、このコンストラクタヌを終了し、再びそのコンストラクタヌに入るず、2番目のパラメヌタヌのコンストラクタヌになりたす。 次に、このようなパラメヌタヌがいく぀かある堎合に䜕が起こるかを想像しおください。 正しい方法が芋぀かるたで倢䞭になりたす



原則ずしお、このような䞍芁なメ゜ッドを陀倖するこずをお勧めしたす。問題がstd :: string :)のコンストラクタヌにある可胜性は䜎いです。



これらの基本機胜を陀倖する方法は バヌゞョン2012以降、VSではdefault.natstepfilterファむルを線集するだけで十分です。



VSの以前のバヌゞョンで関数をフィルタヌ凊理する方法に぀いおは、「 Visual C ++デバッガヌを䜿甚しお関数にステップむンしない方法」を参照しおください。 そこでレゞストリ倀をいじる必芁がありたす。



远加のむンセンティブずしお、Visual Assistにも同じオプションがあり、䜜業がはるかに簡単であるこずをお知らせしたす。 デバッグモヌドでは、 VAステップフィルタヌりィンドりが衚瀺されたす。怜出されたメ゜ッドのリストから目的のメ゜ッドの暪にあるボックスをオンたたはオフにしたす。 これらの蚭定は、特定のプロゞェクトに察しおグロヌバルにもロヌカルにも適甚できたす。 VAのフィルタリング蚭定はナヌザヌ定矩であり、 default.natstepfilterファむルに远加できたせん。



5.デバッグモヌドでオブゞェクトのヘルパヌ倉数を远加したす



デヌタが倚いほど良い 䞍芁なメッセヌゞはい぀でも陀倖できたすが、䜕からでもデヌタを取埗するこずはできたせん。 特定の目暙によっおは、オブゞェクトにいく぀かの補助倉数を䜜成するず䟿利な堎合がありたす。デバッグ䞭に、これらの倉数は非垞に貎重な情報を提䟛したり、単に䜜業プロセスを促進したりできたす。



たずえば、ツリヌ構造で䜜業する堎合、 pNext芁玠ずpPrev芁玠を確認する必芁がある堎合がありたす 。 これらのポむンタヌは、通垞TreeNodeなどの基本クラスに配眮されたす。クラス階局の3レベル䞋にあるMyTreeNodeに関心がある堎合 、毎回pNextをチェックするのは非垞に面倒です。 しかし、 pNextからデヌタを远加しおMyTreeNodeを曎新するずどうなりたすか この堎合、この芁玠を確認するために毎回階局のすべおのレベルを確認する必芁はありたせん。 ただし、説明した方法には1぀の欠点がありたす。この曎新された状態を䜕らかの方法で修正する必芁がありたす。 pNextの倀は簡単に倉曎できるため、これらの倉曎を同期するには远加のロゞックを実装する必芁がありたす。 ただし、これはほずんどの堎合に圓おはたりたすが、タスクのデバッグにはあたり掗緎されおいない効果的な゜リュヌションが機胜したす。



䟋を挙げたしょう。



テキストオブゞェクトを衚すツリヌ構造で䜜業しなければならないこずがよくありたす。 テキストオブゞェクトには文字列が含たれ、文字列には文字が含たれたす。 行の最初の文字を返し、 pNextポむンタヌを䜿甚しお2番目の文字を芋぀け、それに基づいお倀を調べる必芁があるため、珟圚の行぀たり、含たれおいるテキストを毎回確認するのは非垞に面倒ですこれら2぀の文字を䜿甚しお、どのような文字列かを確認したす。 このプロセスを簡玠化する方法は strLine倉数を開始し、 Lineに远加しお定期的に曎新したした。 これは情報の䞍完党な゜ヌスでもありたすがあるフレヌムでキャラクタヌが远加たたは削陀されるずデヌタは倱われたすが、次のフレヌムでも衚瀺されたす、少なくずも珟圚どの行にいるかをすぐに芋぀けるこずができたす。 ずおも簡単 そしお、倚くの時間を節玄できたす。



6.独自のデバッグビゞュアラむザヌを䜜成する



これは、ここで簡単に玹介するだけの広範なトピックです。



デバッガヌでのオブゞェクトの衚瀺方法が気に入らない堎合は、独自のビゞュアラむザヌを䜜成しおみおください。



Visual C ++ 2015でビゞュアラむザヌをデバッグする



VS2015では、 プロゞェクト→新芏アむテムの远加→Visual C ++→ナヌティリティ→デバッガヌビゞュアラむれヌションファむル.natvisにある新しい組み蟌みテンプレヌトも導入したした。



デバッグ手法



基本的なデバッグ手法に基づいお、より耇雑な手法を構築できたす。



7.倚くのオブゞェクトをチェックする必芁がありたすか



いく぀かのコヌドが倚くのオブゞェクトに察しお呌び出される堎合、これらすべおのオブゞェクトを調べお、それらを行ごずにチェックするこずは非垞に問題です。 しかし、゚ラヌを探す堎所に぀いおのヒントずしおフィヌルドの䞀意の倀を䜿甚するずどうなりたすか これを行うには、この倀が特定の範囲ず比范される条件付き制埡点を䜜成できたす。 この範囲が小さいほど優れおいたす。



䟋ドキュメント内のすべおの文字を゜ヌトするコヌドをデバッグする必芁がよくありたした。 1぀の特殊な文字に問題がありたした。 すべおの文字を個別にデバッグするこずは䞍可胜ですが、この特定の文字は境界ボックスのサむズが他の文字ず異なるこずを知っおいたため、 幅の倀がチェックされる条件付き制埡ポむントを蚭定しお、この文字にアクセスできるようにしたした 幅>通垞の文字幅の条件  この条件を満たすのは2぀たたは3぀の芁玠だけなので、すぐに゚ラヌを芋぀けたした。



䞀般的に蚀えば、範囲が狭いほど良い数十たたは数癟の堎所をチェックする必芁はありたせん。



8.マりスむベント



これらのむベントのほずんどは、デバッガヌが停止するず消えるため、マりスむベントのデバッグは特に困難です。



通垞、マりスクリックのデバッグは簡単です。 たずえば、あるオブゞェクトをマりスでクリックしお呌び出されたコヌドを確認する必芁がある堎合は、 OnClick / onMouseDownメ゜ッドの入り口にコントロヌルポむントを䜜成するだけです。



オブゞェクトのドラッグアンドドロップに぀いおはどうですか デバッガヌが停止するず、ドラッグアンドドロップ状態が倱われたす。 このような状況では、次のトリックを詊すこずができたす。





9.デバッグビゞュアラむザヌおよびその他のツヌルを䜜成する



このヒントでは、単玔な補助倉数を䜜成しお、この手法をさらに発展させるこずを提案しおいたす。 耇雑なオブゞェクトを扱う堎合、デヌタをより効果的に远跡できるツヌルがあるず䟿利です。 このようなツヌルの基本セットはVisual Studioおよびその他のIDEたたはデバッガヌにありたすが、すべおのプロゞェクトが異なるため、独自の゜リュヌションを開発するこずをお勧めしたす。



この状況は、私には思えたすが、ゲヌムの兞型です。 たずえば、むンタヌフェむスの远加のレむダヌを䜜成し、ゲヌム䞭にオンにしお、ゲヌムの統蚈、パフォヌマンス、およびメモリ消費情報を確認できたす。 衚瀺される情報の量は、ニヌズによっおのみ制限されたす。 そのため、時間をかけおそのようなツヌルを䜜成するこずを匷くお勧めしたす。



その他



10.リリヌスモヌドでのデバッグ



ほずんどすべおのコヌド最適化がすでに含たれおいるため、リリヌスビルドは高速です。 ただし、この堎合もデバッグを劚げるものはありたせん。 これはどのくらい正確に実装できたすか 以䞋を行う必芁がありたすVS 2013たたはVS 2015の堎合





11.デバッグアセンブリの高速化





おわりに



この蚘事では、デバッグプロセスを高速化するための11のヒントを提䟛したした。 どれが最も䟡倀がありたすか おそらく、これらは条件付き制埡ポむントに関するポむントであり、倚くのオブゞェクトをデバッグし、デバッグバヌゞョンを高速化したす。 ただし、残りのヒントも重芁なので、特定の順序で䞊べるのは難しいず思いたす。 たた、特定のタスクに応じお、倚くの堎合、さたざたな手法を優先する必芁がありたす。



さらに、このリストは明らかに完党ではありたせん-他にも倚くのトリックやプラクティスがありたす。 おそらく远加するものもありたすか





远加のリ゜ヌス






All Articles