创建一个MiniDump,不包括运行时分配的内存范围

Create a MiniDump excluding a range of run-time allocated memories

本文关键字:运行时 不包括 分配 范围 内存 MiniDump 一个 创建      更新时间:2023-10-16

更多信息:

我想使用MiniDumpWriteDump创建一个MiniDump文件,但不包括我在模块内分配的特定内存范围。这些内存范围对于调试并不重要,而且它们相当大(主要是纹理)。

我已经阅读了关于MiniDumpCallback函数的文档,并查看了输入和输出结构提供的信息。MiniDumpCallback输入只允许我决定是否包含可执行映像的内存范围,MiniDumpCallback输出允许我决定为转储文件写入的范围。

因此,我想知道是否有可能创建一个MiniDump,排除分配给超出大小限制的某些变量的内存范围。

操作系统以页为单位分配内存(通常为4 kb),并且只能排除整个页。变量可以在页的中间开始,在页的中间结束。其他变量可以在它之前和之后分配。所以你不能在变量的基础上排除内存

如果一个变量大于一个页面,并且它跨越整个页面,那么可以排除整个页面。但是,这将为您的回调例程做一些工作:

让我假设它不太可能有那么大的结构体。因此,具有这种大小的唯一可能变量是数组。您可以编写一个方法来分配数组并跟踪跨越整个页面的数组。在回调期间,您可以使用GetSystemInfo()确定页面的开始和结束,然后排除页面。

尽管要努力实现这一点,但请考虑:

  • 磁盘空间现在很便宜。多几个MB或少几个MB没关系。购买一个磁盘比实现这样的行为要便宜。
  • 崩溃转储压缩得相当好(至少我收到的那些)。如果您需要发送,请先将其压缩。
  • 如果仍然不够小,您可以将大转储转换为小转储(例如再次在WinDbg和.dump中打开转储)并首先分析该转储。只有在需要的情况下,客户才需要将较大的文件发送给您。
  • 远程调试。例如,客户可以在WinDbg中打开转储,启动调试服务器,您可以连接到它。
  • 对于非常大的分配,c++堆管理器将直接调用VirtualAlloc()。如果内存区域大于512 MB, ProcDump之类的工具已经能够删除最大的分配(-mp开关)。(但请注意,ProcDump将不会发挥作用,如果你有自己的未处理的异常处理程序)