70

私は何年も VS のデバッガーを使用してきましたが、今まで気付かなかった機能に出くわし、「くそっ! どうしてそれを見逃すことができた?こんなに便利だ!」と思うことがあります。

[免責事項: これらのヒントは、C# プロジェクトの VS 2005 で機能します。VS や他の言語の古いバージョンを保証するものではありません]

オブジェクト インスタンスを追跡する

特定のクラスの複数のインスタンスを操作しますか? どうすればそれらを区別できますか? ガベージ コレクション プログラミング以前の時代には、メモリ アドレスを確認するだけで、参照を追跡するのは簡単でした。.NET では、それはできません。オブジェクトが移動してしまう可能性があります。幸いなことに、watches ビューでは、watch を右クリックして [Make Object ID] を選択できます。

時計ビュー http://img403.imageshack.us/img403/461/52518188cq3.jpg

これにより、インスタンスの値の後に {1#}、{2#} などが追加され、インスタンスに一意のラベルが効果的に付与されます。次のようになります。

番号付きインスタンス http://img383.imageshack.us/img383/7351/11732685bl8.jpg

ラベルは、そのオブジェクトの存続期間中保持されます。

監視対象変数の意味のある値

デフォルトでは、監視対象の変数の値はその型です。そのフィールドを表示したい場合は、それを展開する必要があります。フィールドが多数ある場合や、フィールドが複雑な処理を行っている場合、これには長い時間がかかります (またはタイムアウトになることさえあります!)。

ただし、事前定義された型の中には、より意味のある情報を表示するものがあります。

  • 文字列は実際の内容を示します
  • リストと辞書は要素数などを表示します。

意味のある情報 http://img205.imageshack.us/img205/4808/37220487md1.jpg

自分のタイプにそれがあればいいと思いませんか?

うーん...

DebuggerDisplay... .NET Reflector を使用した質の高い時間は、カスタム型の属性を使用してこれをいかに簡単に実現できるかを示しています。

[System.Diagnostics.DebuggerDisplay("Employee: '{Name}'")]
public class Employee {
    public string Name { get { ... } }
    ...
}

... 再実行して...

タダ!http://img60.imageshack.us/img60/926/79816018ha1.jpg

ここには、この件に関するより多くの情報があります: MSDN

すべての例外で中断

…コードで扱うものも!私は生まれてからこれについて知らなかったので、私はとても無知ですが、とにかくここに行きます-多分これはいつか誰かを助けるでしょう

例外がスローされるたびに、デバッグされたプロセスを強制的にデバッグ モードにすることができます。何時間もバグを探し続けて、このようなコードに出くわしたことはありませんか?

try {
    runStrangeContraption();
} catch(Exception ex) {
    /* TODO: Will handle this error later */
}

これらの場合、すべての例外をキャッチすることは非常に便利です。これはDebug > Exceptions... (Ctrl-Alt-E)から有効にできます。必要な例外の種類ごとに、[スロー] 列のボックスにチェックを入れます。


それらは私にとって額を叩く瞬間でした。あなたのものを共有してもよろしいですか?

4

14 に答える 14

19
try {
    // do something big
}
catch {
    // breakpoint set here:
    throw CantHappenException("something horrible happened that should never happen.");
}

最初にスローされた例外をどのように確認しますか? ウォッチ ウィンドウで、$exception と入力します。

于 2008-10-15T13:00:21.587 に答える
17

これが私が学んだ別の巧妙なトリックです:

System.Diagnostics.Debugger.Break()

プログラムによって、次の命令でデバッガーを中断させます。本当に素晴らしい点は、デバッグ情報なしでリリース モードでコンパイルされたプログラムでも機能することです

于 2008-10-15T12:03:56.587 に答える
12

私は常に、作成する新しいスレッドに "Name" プロパティを設定するようにしています。そうすれば、デバッグ中にさまざまなスレッドをより簡単に識別できます。

于 2008-10-14T15:17:35.260 に答える
9

もちろん、今日の VS のヒントもチェックしてください。

http://blogs.msdn.com/SaraFord/

于 2008-10-14T15:07:58.307 に答える
7

私からいくつか

  • [ツール] -> [オプション] -> [デバッグ] で [マイ コードのみを有効にする] オプションのチェックを外します。
  • 条件付きブレークポイント - ほとんど毎日私の命を救ってくれます
  • 問題が発生した場合は、.NET フレームワーク ソースを使用する
于 2008-10-15T12:18:07.413 に答える
7

コード内の 2 つのトリック:

System.Diagnostics.DebuggerStepThrough属性がとても気に入っています。クラス、メソッド、またはプロパティにアタッチして、デバッグ時にVSがデフォルトでコードを入力しないようにすることができます。本当にデバッグする必要がある場合は、無視されたコードにブレークポイントを配置できるため、 DebuggerHidden属性よりも優先します。

もう 1 つの (場合によっては) 便利な呼び出しはSystem.Diagnostics.Debugger.Launch()です。実行がヒットすると、「デバッガーの選択」ダイアログが表示され、デバッガーが起動します。少し失礼ですが、別のプロセスによって生成され、すぐにコードを実行するプロセスなど、プロセスにアタッチするのが特に厄介な場合に便利です。

于 2009-09-02T13:41:55.603 に答える
6

.load sosイミディエイトウィンドウで:)

于 2008-10-15T12:55:26.513 に答える
4

[ツール] -> [プロセスにアタッチ] - 忘れがちですが、これを使用すると、Web ページのスクリプト、別のプロセスに読み込まれたマネージド コード (アドイン モデルを考えてください)、さらにはアンマネージド コードをデバッグできます。関心のあるデバッグの種類を自動的に選択できるように注意してください。

トレースポイント (およびその他のブレークポイント機能... ブレークポイントを右クリックして楽しんでください)! - http://blogs.msdn.com/saraford/archive/2008/06/13/did-you-know-you-can-use-tracepoints-to-log-printf-or-console-writeline-info-without -editing-your-code-237.aspx

即時ウィンドウは素晴らしいです。

リモート デバッグは、アプリをデプロイする場合に非常に役立ちます (そして、問題を再現できるマシンにアクセスできます)。

もっとたくさんあります。WinDbg と SoS を試してみてください。

于 2008-10-15T12:18:45.213 に答える
4

モジュールウィンドウは何度も役に立ちました。デバッガーが必要な dll を読み込んだかどうか、および読み込まれた dll のバージョンを示します。また、dll を手動でロードまたはアンロードすることもできます。

于 2008-12-30T19:13:21.343 に答える
3

ループ内のコード、ループから呼び出されたメソッド、複数のスレッドから呼び出されたメソッドなど、特定の条件下でのみ失敗するコードが何度も繰り返される場合、条件付きブレークは非常に便利です。対象の行に break ステートメントを配置し、その条件をエラー ケースに一致するように設定します。(ここに簡単な例があります。)

于 2008-10-15T12:17:42.283 に答える
2

私から 2 つ: 1 つは、あらゆる場所でみんなに使ってもらいたいものです:

Debug.Assert(<condition>, <message>)

2 番目の DebuggerHidden:

<DebuggerHidden()> _
Public Sub ReadDocumentProperty(ByVal propertyName As String, ByRef PropVal As Integer, ByVal DefaultVal As Integer)
    Try
        Dim prop As Office.DocumentProperty
        prop = CustomProps.Item(propertyName)
        PropVal = CType(prop.Value, Integer)
    Catch
        PropVal = DefaultVal
    End Try
End Sub

Debug、Exceptions、Break on throwed exceptions が設定されていても、ここの例外はキャッチされません。

于 2008-12-30T17:12:03.897 に答える
1

プロセスにアタッチするためのマクロを作成し、未使用のキーボード ショートカットに割り当てます。行くよりずっと速い: デバッグ -> プロセスにアタッチ -> プロセスリストでプロセスを検索 ->...

于 2010-12-04T01:02:45.133 に答える
1

デバッグ ポイントが設定されていない場合でも、例外が発生したときに例外が発生するように IDE を設定するのはどうでしょうか。

デバッグ --> 例外 --> 共通言語ランタイム例外 --> スロー

これにより、隠された例外処理の問題を簡単に見つけることができます。実際には、これはすべての開発者が開発全体を通して設定する必要のある一種の設定であり、未処理の例外や未処理の例外を回避するためのものです。

于 2011-03-16T16:45:59.197 に答える
0

アンマネージ コードでは、「データ ブレークポイント」を設定できます。CPU のデバッグ レジスタを使用して INT3 を発行し、デバッガーは実行時にオーバーヘッドなしでその命令で停止します (古いバージョンでは、デバッガーはメモリをチェックするプログラムをステップ実行していました... 遅い!)

これは、既知のアドレスに何らかの破損がある場合に役立ちます (スタック/ヒープが破壊されます)。

また、ide\packages\debugger の AutoExp.dat をカスタマイズして、データ構造を表示できます。

ポインター、mb はウォッチ ウィンドウに 16 進ダンプを表示します http://msdn.microsoft.com/en-us/magazine/dd252945.aspx

うーん!

于 2010-08-24T16:39:02.287 に答える