我正在尝试调试 ASP.NET 应用程序。这特别困难,因为该错误仅发生在部署到生产的已发布代码中。它不能在开发或测试环境中复制。
我想通过在发生问题的代码中的特定行创建转储文件来进一步调查。但是,由于业务需求,不能随时关闭生产环境。这也是不能使用远程调试的原因。
有谁知道我如何在托管代码的某个点强制为 w3wp.exe 创建转储文件,但仍允许应用程序的其余部分正常运行?
如果 web 应用程序具有访问权限并且您可以在环境中部署新代码,那么您可以使用 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);
}
}
}
只是添加到 Frederik 的帖子中,看看 Tee 的博客,但要专注于使用 AdPlus,它是一种命令行工具,可以帮助您为正在运行的进程创建转储文件。Tess 有许多示例说明如何使用此工具收集转储文件以进行调试。