如何创建当前ASP.NET托管进程的转储以进行调试?

时间:2009-07-25 07:54:08

标签: .net asp.net debugging clr dump

我正在尝试调试ASP.NET应用程序。由于错误仅发生在已部署到生产的代码中,因此特别困难。它无法在开发或测试环境中重现。

我想通过在问题发生的代码中的特定行创建转储文件来进一步调查。但是,由于业务需求,生产环境无法在任何时候被取消。这也是无法使用远程调试的原因。

有没有人知道如何强制在托管代码中的某个点为w3wp.exe创建转储文件,但仍然允许应用程序的其余部分正常运行?

2 个答案:

答案 0 :(得分:2)

如果web-app具有访问权限并且您可以在环境中部署新代码,那么您可以使用DbgHelp API手动创建转储文件:

[DllImport("DbgHelp.dll", SetLastError = true)]
        static extern bool MiniDumpWriteDump(IntPtr ProcessHandle, int ProcId, IntPtr FileHandle, int DumpType, IntPtr ExcpInfo, IntPtr UserInfo, IntPtr ExtInfo);
    private static void DumpIt()
    {
        string outputFileName = "c:\\mem.dmp";

        using (FileStream stream = new FileStream(outputFileName, FileMode.Create, FileAccess.ReadWrite))
        {
            using (Process proc = Process.GetCurrentProcess())
            {
                MiniDumpWriteDump(proc.Handle, proc.Id, stream.SafeFileHandle.DangerousGetHandle(), (int)0x00000306, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
            }
        }
    }

答案 1 :(得分:0)

只是添加到Frederik的帖子,看看Tee的博客,但专注于使用AdPlus这是一个命令行工具,可以帮助您为运行的进程创建转储文件。 Tess有很多关于如何使用这个工具收集转储文件以便调试的例子。