9

デバッグレジスタを直接設定するために、CBreakpoint例のように、プログラムによるデータブレークポイントを使用しようとしました。SetThreadContext私が見つけることができるほとんどの参照は、データ ブレークポイント自体を設定していなくても、Visual Studio がデータ ブレークポイントに遭遇するたびに中断することを示しています。ただし、これは Visual Studio 2010 の動作ではないようです。

プログラムがデバッグされていないときにデータブレークポイントが完全に機能する状況にあります (STATUS_SINGLE_STEPデータブレークポイントによって発生する例外である でクラッシュします)。WinDbg でデバッグしている場合も、正しく壊れます。しかし、いずれかの Visual Studio 2010 でデバッグすると、追跡を続けてブレークポイントを無視しているように見えます。Windows 7 で、Visual Studio 2010 でプログラムによって設定されたデータ ブレークポイントを使用した経験がある人はいますか? それらを壊すために私がする必要があることはありますか?STATUS_SINGLE_STEP( 「最初の例外」リストに追加しようとしましたが、動作に変更はありません。)

STATUS_SINGLE_STEPまたは、デバッガーで例外を飲み込むために私が行っていることはありますか? 構造化された例外ハンドラーは、デバッガーがそれを見る前に例外を食べますか? これが x86_64 プログラムであることによる影響はありますか? Visual Studio 2010 の設定で行う必要があるダンスはありますか?

4

3 に答える 3

2

少しテストを行い、win7 x64 で VS 2010 SP1 Ultimate を取得し、32 ビット バイナリを使用して HW ブレークポイント (SEH の有無にかかわらず) で正しくブレークしました。ただし、64 ビット バイナリを使用すると、単一のステップがトラップされません (コンパイルするには、いくつかの型を変更する必要がありました)。

もう少し深く掘り下げると、VS の動作がおかしいようです。単一のステップをトラップすることはできませんが、HW ブレークポイントをトリガーするコードのセクションを正しくステップ オーバーすることができません。

ライブラリが x64 で DR レジスタを正しく設定していないように感じます。これは、SetThreadContextx64 で変更を行うためである可能性があります。

アップデート

もう少しいじってみると、使用しているライブラリが、スレッド コンテキストを設定または取得する前にスレッドを中断していないことに気付きました。MSDNは、これは大きな NO-NO であると言います。

実行中のスレッドの有効なコンテキストを取得できません。GetThreadContext を呼び出す前に、SuspendThread 関数を使用してスレッドを中断します。

ただし、ターゲットスレッドを正しく中断し、エラーなしですべての呼び出しを実行する別のライブラリを使用しても、VS は BP をトラップできません。これは、使用しているライブラリだけでなく、VS の x64 デバッガーもバグがあると思います。バグもあります。

于 2012-08-29T09:07:42.810 に答える
0

プロジェクトの混合 (ネイティブ & マネージ) デバッグを有効にしましたか? プロジェクトのプロパティ - >構成プロパティ - >デバッガ - >「混合」に設定されたデバッグタイプに移動しました

ここでこの回答を見つけました: https://social.msdn.microsoft.com/Forums/windowsserver/en-US/47ebd835-e538-4ff6-8c91-df45bd46d548/vc-express-2012-x64-clr-breakpoint-not-hit -no-executable-associated-static-library?forum=windbg

于 2015-10-09T20:31:41.143 に答える
-3

DebugBreak()MSVC 2010 で実行をプログラムで中断するために使用できるという名前の関数がありますが、 DebugBreak( 逆アセンブリ コード ) 内で停止します。したがって、コードの使用だけを中断したい場合、__asm int 3これは非常に簡単で、Intel 互換のすべての CPU で動作します。

または実行時のエラーを回避するIsDebuggerPresent()前に、もう1つの注意事項を使用します(もちろん、すでにそれを知っています!:))DebugBreak()__asm int 3

于 2012-09-01T02:06:03.630 に答える