web-dev-qa-db-ja.com

VisualStudioでデバッグ中にGetLastError()を実行する方法

C/C++コードをステップ実行していて、失敗したWin32 APIを呼び出したところです(通常、0などの役に立たない一般的なエラーコードを返します)。コードは、後続のGetLastError()呼び出しを行いません。その戻り値は、さらにエラー情報を調べることができます。

失敗を再コンパイルして再現せずにエラー値を取得するにはどうすればよいですか?ウォッチウィンドウに「GetLastError()」と入力しても機能しません(「構文エラー」)。

45
Peter Baer

数回述べたように、@err疑似レジスタは最後のエラー値を表示し、@err,hrはエラーを文字列として表示します(可能な場合)。

VisualStudioチームのメンバーであるAndyPennellによると、VS 7(Visual Studio .NET 2002)以降、疑似レジスタを示すために「@」文字を使用することは非推奨です-彼らは「$」を使用することを好みます($err,hrのように) )。当面は$と@の両方がサポートされます。

条件付きブレークポイントで$ err疑似レジスタを使用することもできます。したがって、最後のエラーがゼロ以外の場合にのみ、コード行を中断できます。これは非常に便利なトリックになる可能性があります。

便利なその他の疑似レジスタ(John Robbinsの著書、 "Debugging Applications for Microsoft .NET and Microsoft Windows" ):

  • $tib-スレッド情報ブロックを表示します
  • $clk-クロックカウントを表示します(タイミング機能に役立ちます)。これをより簡単に使用するには、$clk時計を配置してから、追加の$clk=0時計を配置します。 2番目のウォッチは、現在の値の表示後に疑似レジスタをクリアするため、次のステップまたはステップオーバーでは、そのアクションの時間のみが与えられます。これは、かなりのデバッガオーバーヘッドを含む大まかなタイミングですが、それでも非常に役立つ場合があることに注意してください。
60
Michael Burr

ERR,hrウォッチウィンドウでは、通常、トリックを行います

6
QBziZ

「編集して続行」してコードを追加すると、エラーが表示されます(保存するための新しいグローバル変数を作成しないでください)。この種のエラー処理コードを実行する既存の関数をすばやく呼び出すことができれば、非常にうまく機能します。

ボーナスとして、将来のために新しいコードをそこに残すこともできます。

これができない場合は、QBziZが「ERR、hr」で正しく実行されます。

0
gbjbaanb