そのため、特定のAPIまたはWindowsメッセージにブレークポイントを設定したいと思います。Delphiのバージョンでコードを記述せずにそれを行う簡単な方法は見つかりません。メモリアクセスにブレークポイントを設定できるのと同様の方法はありますか?
2 に答える
API 関数の呼び出しを停止するには、 Windows.pasimplementation
のセクション(または目的の関数が宣言されている場所) で見つけて、ブレークポイントを設定します。これにより、ロード時の動的リンクで使用する関数が処理されます。実行時の動的リンク (および) の場合は、別の手法が必要になります。結果を取得する変数には、ブレークしたいアドレスが保持されますが、そのアドレスにブレークポイントを設定する方法がわかりません。LoadLibrary
GetProcAddress
GetProcAddress
メッセージは多くの場所で取得できるため、ウィンドウ メッセージで停止するのはより注意が必要です。代わりに条件付きブレークポイントを使用する必要があります。
投稿されたほとんどのメッセージをキャッチするにはTApplication.HandleMessage
、 への呼び出しの後の最初の行にブレークポイントを配置できますPeekMessage
。条件を に設定しますMsg.Message = x
。メインメッセージ ループと VCL のモーダル メッセージ ループHandleMessage
のメイン スレッドのメッセージ キューに投稿されたメッセージを処理します。Application.Run
ただし、他のモーダル ダイアログ ( などWindows.MessageBox
) では使用されません。
送信されたメッセージの監視は、OS がメッセージをターゲット ウィンドウ プロシージャに直接ディスパッチするため、より困難です。関心のあるすべてのウィンドウ クラスのウィンドウ プロシージャにブレークポイントを設定する必要があります。ほとんどの VCL ウィンドウ クラスは、条件付きブレークポイントを に配置することで取得できますClasses.StdWndProc
。
条件付きブレークポイントは非常に遅くなる可能性があることに注意してください。それらは、デバッガーがそこに無条件のブレークポイントを配置することによって機能し、OS がそれをトリガーすると、デバッガーが引き継ぎ、条件をチェックし、条件が失敗した場合は実行を再開します。これには、デバッガーとアプリケーションの切り替えという、多くのオーバーヘッドが伴う可能性があります。プログラムは大量のメッセージを受け取るので、デバッガーがプログラムを中断してすべてのメッセージをチェックすることを回避する方法を見つけられる場合は、それを実行してください。
デバッグしようとしているものに対してこれが実行できない場合は、実際に解決しようとしている問題を説明する新しい質問を投稿することをお勧めします。
[オプション] | [オプション] に移動する必要があります。リンカーを開き、「Debug DCUs」をチェックします。デフォルトでは、これはチェックされていないため、作業しようとしているときにデバッガーは VCL 全体をステップ実行しません。