.net 从应用程序内部执行procdump以创建应用程序本身的转储

.net 从应用程序内部执行procdump以创建应用程序本身的转储,.net,visual-studio-2010,procdump,.net,Visual Studio 2010,Procdump,我正试图让我的应用程序(VB.NET根据framework.NET 4.0编译)自己编写一个进程转储,以帮助我进行调试。为此,我使用了Sysinternals中的Procdump 首先,我只需在单击事件上执行以下代码(因此调用堆栈上应该有一些可识别的内容): 最后一行也是一个断点 要创建转储,我在VS2010内以调试模式启动应用程序,单击一个按钮以执行此代码,当它到达断点时,我知道转储已经被写入。此时,我还使用Visual Studio创建了另一个转储文件(调试->将转储另存为..) 这就给我留

我正试图让我的应用程序(VB.NET根据framework.NET 4.0编译)自己编写一个进程转储,以帮助我进行调试。为此,我使用了Sysinternals中的Procdump

首先,我只需在单击事件上执行以下代码(因此调用堆栈上应该有一些可识别的内容):

最后一行也是一个断点

要创建转储,我在VS2010内以调试模式启动应用程序,单击一个按钮以执行此代码,当它到达断点时,我知道转储已经被写入。此时,我还使用Visual Studio创建了另一个转储文件(调试->将转储另存为..)

这就给我留下了两个大小大致相同(400 Mb左右)的转储文件,一个是由Procdump.exe创建的,另一个是由Visual Studio创建的。在不接触任何生成的代码的情况下,我现在打开两个转储文件(在生成的代码打开时,我点击Ctrl+O),并在“符号文件夹”选项中指定调试输出文件夹

现在,当我在VisualStudio创建的转储上单击“Debug with mixed”时,我得到了一个具有可识别方法名称的调用堆栈(在主线程上),调试器将它很好地定位在源代码中断点所在的位置

但是,当我在Procdump创建的转储上单击“Debug with mixed”时,(主线程的)调用堆栈只包含clr.dll之类的内容!6cb34e46(),KERNELBASE.dll!75106a8e()和ntdll.dll!76f07094()位于顶部。没有可识别的代码,也与手表无关

这是为什么?实际上,我希望这两个转储几乎相等(只差几行代码)。[与附加的调试器有关,请参见下面的编辑。]

请注意,在这两种情况下,符号都已正确加载。我在Debug->Windows->Modules中得到的清单显示了为两个转储加载的相同符号。此外,如果我切换到两个转储中的后台线程,我将在两个转储中获得这些线程的正确调用堆栈(以及它们的变量值等等)

编辑


我注意到,通过在没有附加调试器的情况下执行应用程序,我得到了预期的进程转储(即,与VisualStudio捕获的进程转储相同,但相差一行)。问题解决了。但是我仍然很好奇为什么我没有在附加了调试器的情况下得到这个结果。

procdump本身就是一个调试器。您所做的是要求它转储一个已经被调试的进程,因此差异转储文件。

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