マネージド ヒープの破損を調査するために、ba (アクセス時にブレーク) ブレークポイントを使用したいと考えています。それらをマネージ コードで使用できますか? はいの場合、どのようにプログラムで設定できますか?
更新: それも問題ないので、WinDbg に設定します (-> XY 型のすべてのオブジェクトに対して ba を設定します)。
マネージド ヒープの破損を調査するために、ba (アクセス時にブレーク) ブレークポイントを使用したいと考えています。それらをマネージ コードで使用できますか? はいの場合、どのようにプログラムで設定できますか?
更新: それも問題ないので、WinDbg に設定します (-> XY 型のすべてのオブジェクトに対して ba を設定します)。
'ba'コマンドで設定されたブレークポイントは、プロセッサまたはハードウェアブレークポイントと呼ばれます。
まず良いニュース
ハードウェアブレークポイントを設定するのは簡単です。プロセッサのデバッグレジスタ(DR0、DR1、DR2、またはDR3)の1つにデータのアドレスを設定し、デバッグ制御レジスタDR7にフィールドを設定してメモリのサイズとアクセスのタイプを設定する必要があります。命令(x64アセンブラ)は次のようになります。
MOV rax、DR0
明らかに、選択した言語からこのアセンブラ命令を実行するか、C ++およびインラインアセンブリへの相互運用を使用する必要がありますが、これは、たとえばソフトウェアブレークポイントを設定するよりも簡単です。
今悪いニュース
まず、SMPマシンでは、コードにアクセスできるすべてのプロセッサに対してこれを実行する必要があります。これは、プロセスにプロセッサアフィニティを設定するか、シングルプロシージャマシンでデバッグを行う場合におそらく解決可能です。次に、Intelアーキテクチャには4つのデバッグプロセッサしかありません。WinDbgを使用してプロセッサブレークポイントを設定しようとすると、4回目以降はToo many data breakpoints for thread N
、を押した後に文句を言いますg
。
自動化について質問している目的は、オブジェクトが多すぎて手動でブレークポイントを設定できないためだと思います。とにかく4つのブレークポイントに制限されているのでba
、これを自動化する意味はあまりありません。