gpt4 book ai didi

c++ - 创建一个 MiniDump,排除一系列运行时分配的内存

转载 作者:太空狗 更新时间:2023-10-29 23:13:22 28 4
gpt4 key购买 nike

更多信息:

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

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

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

最佳答案

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

如果变量大于页面并且跨越整个页面,则可能会排除整个页面。但是,这将对您的回调例程起作用:

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

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

  • 现在磁盘空间很便宜。几 MB 或多或少并不重要。购买磁盘比实现这种行为更便宜。
  • 故障转储压缩得很好(至少我收到的是这样)。如果您需要发送,请先压缩。
  • 如果仍然不够小,您可以将大转储转换为小型转储(例如,在 WinDbg 中打开转储并再次 .dump)并首先分析那个转储。只有在需要时,客户才需要向您发送更大的文件。
  • 远程调试。客户可以,例如在 WinDbg 中打开转储,启动调试服务器,您可以连接到它。
  • 对于非常大的分配,C++ 堆管理器无论如何都会直接调用 VirtualAlloc()。如果内存区域大于 512 MB,工具如 ProcDump已经能够删除最大的分配(-mp 开关)。 (但请注意,如果您有自己的未处理异常处理程序,ProcDump 将不会发挥作用)

关于c++ - 创建一个 MiniDump,排除一系列运行时分配的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39842220/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com