通过.NET 4.0中的转储调试支持,我们自动调查(当然询问用户:)创建C#程序崩溃的小型转储以将它们上传到我们的问题跟踪系统(以便minidumps可以帮助解决原因崩溃).
使用WithFullMemory minidump类型时,一切正常.我们可以看到堆栈和堆变量.不幸的是,即使对于小型C#程序,(zipped)转储也非常大.
如果我们使用"Normal"minidump类型,我们会得到一个非常小的转储,但托管调试器中甚至没有堆栈变量信息.事实上,任何比WithFullMemory更少的东西在托管调试器中似乎都没用.我们已经尝试过使用MINIDUMP_CALLBACK_ROUTINE将包含的模块信息限制到我们自己的模块,但它似乎对托管转储几乎没有影响,但仍设法破坏托管调试?
有没有人有关于如何修剪minidump同时保持其对托管调试有用的任何提示?
有一个本地 C++ 应用程序,它承载了几个 .net 组件。当发生某些错误时,此应用程序使用 MiniDumpWriteDump 函数创建小型转储。在这里提问什么是最小集合
[Flags ]enum MINIDUMP_TYPE {
MiniDumpNormal = 0x00000000,
MiniDumpWithDataSegs = 0x00000001,
MiniDumpWithFullMemory = 0x00000002,
MiniDumpWithHandleData = 0x00000004,
MiniDumpFilterMemory = 0x00000008,
MiniDumpScanMemory = 0x00000010,
MiniDumpWithUnloadedModules = 0x00000020,
MiniDumpWithIndirectlyReferencedMemory = 0x00000040,
MiniDumpFilterModulePaths = 0x00000080,
MiniDumpWithProcessThreadData = 0x00000100,
MiniDumpWithPrivateReadWriteMemory = 0x00000200,
MiniDumpWithoutOptionalData = 0x00000400,
MiniDumpWithFullMemoryInfo = 0x00000800,
MiniDumpWithThreadInfo = 0x00001000,
MiniDumpWithCodeSegs = 0x00002000,
MiniDumpWithoutManagedState = 0x00004000,
};
Run Code Online (Sandbox Code Playgroud)
应该传递给 MiniDumpWriteDump 以生成小的转储文件但能够查看 clr 堆栈)?当然,完整的内存转储可以工作,但如何只获得可承受的最小值?
不久前,我们了解到即使发布版本也可能无法正常运行 - 可能会崩溃 - 可能会挂起等。因此,我们决定实施转储创建过程。所有步骤都相当快地在互联网上找到了。但有一点——主要的事情——对我们来说仍然无法理解。
根据 MSDN,MINIDUMP_TYPE 支持 23 个标志。但对于下一个问题,没有深入的技术解释:它们在各自的应用领域都是独立的吗?或者它们可以成对、三组使用吗?它们可以同时使用吗?我可以在某些组中使用它们吗(例如,一些 3 个标志 - 生成与其他 5 个标志几乎相同的转储。)我的意思是,当我将用于 ex. 1+3 标志 - 绝对等于使用标志 4+6+9。或者标志 1 或标志 3 或... - 是所有其他标志的叠加?或者是什么?我想了解所有可用标志之间所有可能的交叉。因为也许使用标志 3+12+14 没有实际意义,例如,我当前的目标是使用内存中绝对所有可用数据创建转储。我应该能够查看所有线程、所有 local-static-global-in_heap 变量。我的意思是,当我打开一些由 bla+bla+bla 标志组合生成的转储时,它应该与我可以将调试器直接附加到进程时完全相同。我应该获取所有可能的数据!
PS MiniDumpWithFullMemory - 没有给我这样的能力(((为什么?@FULL@内存这个词 - 并不意味着完整?它只是什么的一部分?
我觉得有点懒,问这个,但我似乎无法召唤正确的谷歌查询来找到我的问题的答案.
一点背景.我有一个应用程序,它将监视未处理的异常和崩溃等其他进程.当触发时,此应用程序收集系统信息并使用MiniDumpWriteDump创建memory.dmp文件.
我们现在喜欢这个进程监控应用程序将崩溃数据上传到服务器,但显然memory.dmp文件可能很大,这对于上传来说是不可取的.因此,我们发现当我们创建memory.dmp时,我们可以减小memory.dmp的大小(如果我们不包含那么重要的信息,可能会使memory.dmp无用)或最终不得不上传大量文件.
无论如何,在我们创建了memory.dmp后,它可以被打开,一些初始分析完成(我知道这个位是可能的)并且memory.dmp的任何位被认为是无用的,被删除/删除(和改为更换了memory.dmp的较小副本)?
例如,memory.dmp的"位"是指.删除处理数据或有关卸载模块的信息.请参见MINIDUMP_TYPE枚举