1

デバッグに役立つように、自分のアプリケーション (フレームワーク .NET 4.0 に対してコンパイルされた VB.NET) 自体のプロセス ダンプを書き込もうとしています。このために、Sysinternals の Procdump を使用しています。

開始するには、クリック イベントで次のコードを実行するだけです (したがって、コール スタックで何か認識できるはずです)。

Dim p As New Process
p.StartInfo.FileName = "C:\procdump.exe"
p.StartInfo.Arguments = "-accepteula -ma " & Process.GetCurrentProcess.Id
p.Start()
p.WaitForExit()
p.Dispose()       ' Breakpoint

最後の行にもブレークポイントがあります。

ダンプを作成するには、VS 2010 内でアプリケーションをデバッグ モードで起動し、ボタンをクリックしてこのコードを実行します。ブレークポイントに到達すると、ダンプが書き込まれたことがわかります。この時点で、Visual Studio を使用して別のダンプ ファイルも作成します ([デバッグ] -> [ダンプを名前を付けて保存])。

これにより、Procdump.exe によって作成されたものと Visual Studio によって作成されたものの、ほぼ同じサイズ (400 メガバイト) の 2 つのダンプ ファイルが残ります。ビルドされたコードには何も触れずに、両方のダンプ ファイルを開き (ビルドされたコードを開いた状態で Ctrl+O を押します)、シンボル フォルダー オプションでデバッグ出力フォルダーを指定します。

ここで、Visual Studio によって作成されたダンプで [混合でデバッグ] をクリックすると、(メイン スレッドで) 認識可能なメソッド名を含むコール スタックが取得され、デバッガーはそれをソース コード内のブレークポイントのある位置に適切に配置します。だった。

ただし、Procdump によって作成されたダンプで [混合でデバッグ] をクリックすると、(メイン スレッドの) コール スタックには clr.dll!6cb34e46()、KERNELBASE.dll!75106a8e() と ntdll.dll! のようなものしか含まれません。上部に 76f07094() があります。認識可能なコードはなく、時計に関連するものもありません。

何故ですか? 実際、私はこれら 2 つのダンプがほぼ等しいことを期待していました (数行のコードが異なるだけです)。 [アタッチされているデバッガーと関係があります。以下の編集を参照してください。]

どちらの場合も、シンボルが正しく読み込まれたことに注意してください。Debug->Windows->Modules で取得したリストは、両方のダンプに同じシンボルがロードされることを示しています。さらに、両方のダンプでバックグラウンド スレッドに切り替えると、両方のダンプでこれらの (変数の値などを含む) の正しいコール スタックが取得されます。

編集

デバッガーを接続せずにアプリケーションを実行すると、予想されるプロセス ダンプが得られることに気付きました (つまり、Visual Studio によってキャプチャされたものと同じですが、1 行ずれています)。問題が解決しました。しかし、デバッガーを接続した状態でなぜその結果が得られなかったのかについては、まだ興味があります。

4

1 に答える 1

1

procdump 自体はデバッガーです。あなたがしているのは、すでにデバッグされているプロセスをダンプするように要求しているため、差分ダンプ ファイルです。

于 2013-04-29T23:38:47.273 に答える