MSVS Lifehacks Vol。1-デバッガー。 段階的な管理

私たちの多くはVisual Studio 2010デバッガーを使用していますが、デバッグを容易にする追加の文書化されていない設定があることにほとんどの人が気付いていないことは間違いありません。



この記事では、ステップバイステップの実行中に、ライブラリコード内にある定数を取り除く方法を説明します。 これは種用です。 後で、ローカルやウォッチなどのデバッグウィンドウで型の表現を制御するメカニズムについて説明します(ベクトル/マップがどれだけ美しく表示されるかなど、誰もが見ましたか?)。



主な焦点はネイティブコードのデバッグです。



それでは、始めましょう。



すでにC ++ 11に切り替えている場合は、次のようなコード行に精通している必要があります。

do_something std :: move some_obj ;
まあ、またはそのような:
do_something std :: forward < T1 > rr1 、std :: forward < T2 > rr2 、std :: forward < T3 > rr3 ;


少なくとも頻繁にデバッグするとき、私はそのようなことを見ます。 そして、これは腹立たしいことです。あなたはそのような挑戦に立ち向かい、F11を押してdo_somethingの中に入りたいと思っていますが、そうではありません! 最初に、これらすべてのstd :: moveおよびstd :: forwardの内部に入り、次に必要な場所に移動します。



少なくとも2番目の例(std :: forwardへの3つの呼び出し)を取り上げます。

do_somethingの中に入るには、F10、F10、F10、F11を押す必要があります。 これが最速の方法です。 誰も使用していません。F10の量を間違えて、目的のコールを「ステップスルー」するのは簡単です。 したがって、適切な場所に到達するまで[ステップイン]、[ステップアウト]をクリックします。 F11、Shift-F11、F11、Shift-F11、F11、Shift-F11、F11が判明-ある種の恐怖! それでも、個人的に私は定期的に正しい電話を逃しています。



そして、ある日、私はそれに飽きました。 Step Inがいくつかの機能を無視して、少なくとも移動と前進(それらに何が見えなかったのでしょうか?) そして彼は捜索を始めました。



.NETには、「Just my code」、「Step over property and operator」、「Enable .NET framework source stepping」というオプションがあり、 属性を使用し手動で設定することもできることがすぐに明らかになりました。 ネイティブコードの場合、そのようなパラメーターはありません...またはありますか?



まだあることが判明しました。 レジストリで、非公式。



ステップごとの実行:ネイティブコードデバッガーのドキュメント化されていない機能。



ブランチに興味があります:

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ VisualStudio \ 10.0 \ NativeDE \ StepOver-x86の場合

HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ VisualStudio \ 10.0 \ NativeDE \ StepOver-x64の場合



このブランチには「文字列」タイプのパラメーターが含まれ、その名前は何の役割も果たしませんが、値はデバッガーの動作を決定します。



値の構文は次のとおりです。
<関数名に一致する正規表現> [= NoStepInto]


「= NoStepInto」は、デバッガーが指定された関数内に入れないことを意味します。 「= NoStepInto」、tkを安全に省略できます。 これはデフォルトの動作であり、デバッガーに対する他の「命令」はわかりません。



正規表現の構文は、searchの構文に加えて、次のコマンドと同じです。
"cid:"-C / C ++識別子名

"funct:"-C / C ++関数の名前(これはcidと同じようです:)

「scope:」-クラス/スペース識別子のセット

関数の名前(例:ATL :: CFoo :: CBar::)

「scope:」は空の文字列と一致できません

"anything:"-任意の行を含む。 引用符なし

「oper:」-C ++演算子(「*」など)


例:


std :: forwardを入力しないでください:
std \:\:forward \ <。* \>
stdを入力しないでください:: move:
std \:\:移動\ <。* \>
テスト名前空間の機能を入力しないでください。
テスト\:\:funct \:
オーバーロードされた演算子を入力しないでください。
\スコープ:演算子\ oper:


追加のメモ:




結論:


ハレルヤ! レジストリを編集することにより、std ::再び進むことはありません! F11を押すと、コード内で必要な場所に移動します。



軟膏で飛ぶ。



stlの中に入れないで、同時にブーストしたいとします。 簡単! レジストリに適切な行を追加します...しかし、このコードでF11を押したい場合はどうでしょうか:
std :: sort vec。begin 、vec.end 、my_pred ;
my_pred :: operator()が呼び出された場合、その内部に入りましたか?



デバッグ時にソースコードレベルで関数に入るかどうかを制御できるようにする方法(C#では属性を使用してこれを行います)



次のシリーズをお読みください。



All Articles