我正在尝试将我的应用程序(VB.NET针对框架.NET 4.0编译)编写自己的进程转储以帮助我进行调试。为此,我正在使用来自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创建另一个转储文件(Debug - > Save Dump As ..)。
这给我留下了两个大小相等的转储文件(400个Mb),一个由Procdump.exe创建,另一个由Visual Studio创建。在没有触及任何构建的代码的情况下,我现在打开两个转储文件(打开构建的代码,按Ctrl + O)并在符号文件夹选项中指定调试输出文件夹。
现在,当我在Visual Studio创建的转储上单击“Debug with mixed”时,我得到一个带有可识别方法名称的调用堆栈(在主线程上),调试器将它很好地定位在源代码中的位置,断点所在的位置。
然而,当我在Procdump创建的转储上单击“Debug with mixed”时,调用堆栈(主线程)只包含clr.dll!6cb34e46(),KERNELBASE.dll!75106a8e()和ntdll之类的东西.dll!76f07094()在顶部。没有可识别的代码,也没有任何相关的手表。
为什么会这样?实际上,我期待这两个转储几乎相同(只有几行代码关闭)。 [与附加的调试器有关,请参阅下面的编辑。]
请注意,在两种情况下都正确加载了符号。我在Debug-> Windows-> Modules中获得的列表显示了为两个转储加载的相同符号。此外,如果我在两个转储中切换到后台线程,我会在两个转储中为这些(使用其变量的值等)获得正确的调用堆栈。
修改
我注意到,通过在没有附加调试器的情况下执行应用程序,我获得了预期的进程转储(即,等于Visual Studio捕获的那个,但是关闭了一行)。问题解决了。但我仍然很好奇为什么我没有附加调试器得到那个结果。
答案 0 :(得分:1)
procdump本身就是一个调试器。你正在做的是要求它转储一个已经被调试的进程,因此就是差异转储文件。