6

Visual Studio 2008 を使用して、実行中のプロセスのバグを追跡しています。プロセスに接続し、関心のあるモジュールを特定しました。(このモジュールのデバッグ シンボルが pdb ファイルから読み込まれていることがあります。) ブレークポイントを設定する場所を決定できるように、[逆アセンブル] ウィンドウに逆アセンブルされたコードを表示したいと考えています。

プロセスを中断すると、現在実行中のモジュールが [逆アセンブリ] ウィンドウに表示されます。残念ながら、これは目的のモジュールではありません。実行していないモジュールのコードを表示する方法がわかりません。

4

3 に答える 3

5

管理されていないプロセスをデバッグしていると仮定します...

「すべてをデバッグ/中断」するときは、次の手順に従います。

「Debug/Windows/Modules」を選択して、ロードされたすべてのモジュールのリストを取得します。[モジュール] ウィンドウの [アドレス] 列の下に、そのモジュールのメモリ範囲があります。逆アセンブリ ウィンドウの [アドレス:] ボックスに、モジュールの開始アドレスを入力します (番号の前に必ず 0x を追加してください)。

これで、操作したいモジュールの先頭にいるはずです。関数のアドレスがわかっている場合は、そのアドレスにジャンプできます。

次に例を示します。

sol.exe を実行し、プロセスにアタッチし、すべてを中断します。モジュールを見て、「cards.dll」を見つけてください。6fc10000 にロードされていることがわかります (私のマシンでは)。

そのアドレス (0x6fc10000) を逆アセンブリ ウィンドウに入力すると、モジュールの先頭に移動します。

ここで、実際に関数にジャンプしたいとします。Dependency Walker (depends.exe) で DLL を開き、関数のオフセットを取得します。私の例では、関数「cdInit」にブレークポイントを設定したいと考えています。Dependecny Walker では、エクスポートされた関数 cdInit へのオフセットが 0x000013e6 であることを示しています。したがって、その関数を取得するには、モジュールの開始アドレス (0x6fc10000) をオフセット (0x000013e6) に追加して 0x6fc113e6 を取得します。

このアドレスを分解ボックスに入力すると、実際にその関数の最初にジャンプします。

于 2010-01-28T17:45:44.047 に答える
1

このようなことを行うのは、WinDbg の方がはるかに簡単です

uf cards!cdInit
于 2010-01-28T19:41:54.217 に答える
0

.Net Reflector を使ってみましたか? DLL からすべてのコードを取得し、デバッグ メッセージを含めて再コンパイルすることもできます。それは無料です:

http://www.red-gate.com/products/reflector/

乾杯

于 2010-01-28T19:39:33.880 に答える