web-dev-qa-db-ja.com

Visual Studio Attach to Processはどのように機能しますか?

VisualStudioのデバッガーとデバッガー全般の内部動作を常に知りたいと思っていました。特にホストプロセスまたは外部ネットワークサーバー(プロセスに接続)内で実行されている場合、コードはどのように通信および制御しますか?コンパイラーまたはリンカーは、デバッガーに制御が与えられるように、コールバックでコードにパッチを適用しますか?それが実際にこのように機能する場合、デバッグコードを含まないJavaScriptなどのインタープリター言語はどのように機能しますか?

9
ATL_DEV

一般的に、Windowsは、別のプロセスでメモリを調べて変更したり、別のプロセスで例外が発生したときに通知を受け取ったりできるデバッガーを作成するための API を提供します。

デバッグプロセスはループ内にあり、検査中のプロセスからのイベントからの通知を待機しています。ブレークポイントを設定するために、デバッガプロセスはデバッグ対象のコードを変更して例外(通常はint 3 x86の命令)。

コンパイラーとリンカーは連携して、プログラムに関するシンボル情報をデバッガーが読み取れる形式で使用できるようにします。 Windowsでは、これは通常、別のPDBファイル内のCodeViewです。

Unixから派生した世界には、WindowsデバッグAPIと本質的に同じ種類のことを行うptraceと呼ばれるAPIがあります。

リモートデバッグの場合、ローカルマシンで実行されている実際のデバッガーと通信し、その代わりに動作する小さなプログラムがリモートマシンに配置されます。

JavaScriptのようなインタープリター言語の場合、デバッガーはインタープリターと連携して、同じ種類の機能(メモリの検査、ブレークポイントの設定など)を提供します。

6
Adrian McCarthy

Windowsにはデバッガーのサポートが含まれています。プロセスはデバッガー特権を有効にする必要があります。これが行われると、そのプロセスは他のプロセスに接続し、Windowsデバッガー関数を使用してデバッグできます。

http://msdn.Microsoft.com/en-us/library/windows/desktop/ms679303(v = vs.85).aspx

Javascriptのようなものの場合、javascriptデバッガーと同等のものが必要になるようです。

Visual Studioマルチプロセスプロジェクトの場合、通常、そのプロセスをデバッグするには、デバッガーが接続されているプロセスを切り替える必要があります。複数のプロセスに同時に保留中のブレークポイントを設定する方法があるかどうかはわかりません。複数のプロセスでより適切に機能する他のデバッガーが存在する可能性がありますが、私はそのようなツールを使用していません。

1
rcgldr