Generate/createmdumpfileinmyapplication必须提取3dparty工具。不想使用ProcDump的主要原因是:1)二进制文件的大小会显着增加(这是一个问题,因为我的应用程序是免费软件并且带宽不是免费的)。2)感觉很脏。3)我无法移植应用程序以运行WindowsMobile。我的要求是:1)能够在致命崩溃中生成mdump文件。2)能够“暂停”应用程序以执行转储,并且继续将是一个奖励。如果这不是一个真正的选择,有没有办法在当前上下文中动态获取局部变量的值?旁注:我确实读过这篇文章,但它已经很老了,所以我对我的工作很犹豫。似乎IE9或网站有问题,所以我遇到了标签问题。于是想到一个解决方案,满足以下目标:我给这个需求一个完全未知的:那么解决方案是什么?集成MicrosoftSampleforMDbg.exe所需的部分,为您提供一个“及时”调试器,用于附加、转储和分离崩溃的进程。第1步-首先从此处将源代码下载到mdbg:http://www.microsoft.com/downloads/en/details.aspx?FamilyID=38449a42-6b7a-ee4-80ce-c55645ab1310&DisplayLang=en第2步-创建一个“崩溃”处理程序,它会生成调试器进程并等待完成。我使用以下代码行重新启动带有一些额外参数的同一个exe,以调用调试器并将xml文件输出到std::out。字符串tempFile=Path.GetTempFileName();Mutexhandle=newMutex(true,typeof(Program).Namespace+"-self-debugging");尝试{ProcesspDebug=Process.Start(typeof(Program).Assembly.Location,"debug-dump"+Process.GetCurrentProcess().Id+""+tempFile);如果(pDebug!=null)pDebug.WaitForExit();}catch{}最后{handle.ReleaseMutex();}Console.WriteLine(File.ReadAllText(tempFile));第3步-编写调试转储例程,这可以在同一个exe或不同的exe中。您需要引用(或包含)示例中的“raw”、“corapi”和“mdbgeng”模块。然后在Main()中添加几行:publicstaticvoidMain(string[]args){if(args.Length>0&&args[0]=="debug-dump"){//debug-dumpprocessbyid=args[1],output=args[2]使用(XmlTextWriterwtr=newXmlTextWriter(args[2],Encoding.ASCII)){wtr.Formatting=Formatting.Indented;PerformDebugDump(Int32.Parse(args[1]),wtr);}返回;}//...继续正常程序执行}staticvoidPerformDebugDump(intprocess,XmlWriterx){x.WriteStartElement("process");x.WriteAttributeString("id",process.ToString());x.WriteAttributeString("时间",XmlConvert.ToString(DateTime.Now,XmlDateTimeSerializationMode.RoundtripKind));MDbgEnginee=newMDbgEngine();MDbgProcessme=e.Attach(process);我.Go().WaitOne();尝试{x.WriteStartElement("模块");foreach(MDbgModulemodinme.Modules)x.WriteElementString("module",mod.CorModule.Name);x.WriteEndElement();foreach(MDbgThreadthreadinme.Threads){x.WriteStartElement("线程");x.WriteAttributeString("id",thread.Id.ToString());x.WriteAttributeString("数字",thread.Number.ToString());intixstack=-1;foreach(thread.Frames中的MDbgFrame框架){x.WriteStartElement("frame");x.WriteAttributeString("ix",(++ixstack).ToString());x.WriteAttributeString("loc",frame.ToString(String.Empty));字符串值文本=空;x.WriteStartElement("args");try{foreach(MDbgValuevalueinframe.Function.GetArguments(frame)){x.WriteStartElement(value.Name);x.WriteAttributeString("类型",value.TypeName);尝试{x.WriteAttributeString("value",value.GetStringValue(1,false));}最后{x.WriteEndElement();}}}catch{}x.WriteEndElement();x.WriteStartElement("本地人");try{foreach(MDbgValuevalueinframe.Function.GetActiveLocalVars(frame)){x.WriteStartElement(value.Name);x.WriteAttributeString("类型",value.TypeName);尝试{x.WriteAttributeString("value",value.GetStringValue(1,false));}最后{x.WriteEndElement();}}}抓住{}x.WriteEndElement();x.WriteEndElement();}x.WriteEndElement();}}最后{me.Detach().WaitOne();}x.WriteEndElement();.dll...等...等因为您拥有调试器的全部功能,所以没有什么可以阻止您编写尽可能多或尽可能多的内容,但是上面的示例应该让您开始更新这可以在.Net上运行2.0和/或3.5没有任何进一步的依赖。这可以调试在.Net4.0进程中运行的.Net2.0/3.5代码;但是,它不适用于4.0(目前)。对于4.0CLR,请参阅此帖子:http://blogs.msdn.com/b/rmbyers/archive/2008/10/27/icordebug-re-architecture-in-clr-4-0.aspx您可以从AppDomain.UnhandledException或Application.ThreadException事件处理程序调用MiniDumpWriteDump来创建小型转储。本文详细介绍了此功能:EffectiveMinidumps您还可以使用具有其他功能的库:使用BugTrap捕获所有错误!编辑看起来获得有用的小型转储并不是那么容易。首先,当转储未满时(完整转储大约为100-150MB),sos.dll会报错。其次,不建议在catch块中写dump:抛出异常时获取gooddump。如果您有winforms应用程序,这个问题有一些有用的信息:SetUnhandledExceptionFilter如何在.NETWinForms应用程序中工作?以上就是C#学习教程:Generate/createmdumpfilesharinginmyapplication。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表侵权,如有侵权,请点击右边联系管理员删除。如需转载请注明出处:
