我正在尝试调试ASP.NET应用程序。由于错误仅发生在已部署到生产的代码中,因此特别困难。它无法在开发或测试环境中重现。
我想通过在问题发生的代码中的特定行创建转储文件来进一步调查。但是,由于业务需求,生产环境无法在任何时候被取消。这也是无法使用远程调试的原因。
有没有人知道如何强制在托管代码中的某个点为w3wp.exe创建转储文件,但仍然允许应用程序的其余部分正常运行?
答案 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有很多关于如何使用这个工具收集转储文件以便调试的例子。