创建一个 MiniDump,不包括运行时分配的内存范围
Posted
技术标签:
【中文标题】创建一个 MiniDump,不包括运行时分配的内存范围【英文标题】:Create a MiniDump excluding a range of run-time allocated memories 【发布时间】:2016-10-03 23:56:54 【问题描述】:更多信息:
我想使用 MiniDumpWriteDump 创建一个 MiniDump 文件,但不包括我在模块中分配的特定内存范围。这些内存范围对于调试并不重要,而且它们相当大(主要是纹理)。
我已阅读有关 MiniDumpCallback 函数的文档,并查看了 Input 和 Output 结构提供的信息。 MiniDumpCallback 输入只允许我决定是否包含可执行映像的内存范围,而 MiniDumpCallback 输出允许我决定为转储文件写入的范围。
因此,我想知道是否可以创建一个 MiniDump,排除分配给超出大小限制的某些变量的内存范围。
【问题讨论】:
【参考方案1】:操作系统以页面为单位分配内存(通常为 4 kb),并且只能排除整个页面。变量可能从页面中间开始并在页面中间结束。其他变量可以在它之前和之后分配。所以你不能在变量的基础上排除内存。
如果变量大于页面并且跨越整个页面,则可以排除整个页面。但是,这对您的回调例程来说是一些工作:
让我假设它不太可能有这么大的结构。因此,具有这种大小的唯一可能变量是数组。您可以编写一个分配数组并跟踪跨越整个页面的数组的方法。在回调期间,您可以使用GetSystemInfo() 确定页面的开始和结束,然后排除页面。
尽管为此付出了努力,但请考虑:
现在磁盘空间很便宜。几MB或多或少无关紧要。购买磁盘比实现这种行为更便宜。 故障转储压缩得很好(至少我收到的那些)。如果您需要发送,请先压缩。 如果还不够小,您可以将大型转储转换为小型转储(例如,在 WinDbg 和.dump
中再次打开转储)并首先分析该转储。只有在需要时,客户才需要向您发送较大的文件。
远程调试。客户可以例如在 WinDbg 中打开转储,启动调试服务器即可连接。
对于非常大的分配,C++ 堆管理器无论如何都会直接调用 VirtualAlloc()。如果内存区域大于 512 MB,ProcDump 之类的工具已经能够删除最大的分配(-mp
开关)。 (但请注意,如果您有自己的未处理异常处理程序,ProcDump 将不会发挥作用)
【讨论】:
以上是关于创建一个 MiniDump,不包括运行时分配的内存范围的主要内容,如果未能解决你的问题,请参考以下文章