C++ 创建一个小型转储,不包括一系列运行时分配的内存

C++ 创建一个小型转储,不包括一系列运行时分配的内存,c++,winapi,memory,memory-management,minidump,C++,Winapi,Memory,Memory Management,Minidump,更多信息: 我想创建一个小型转储文件,使用但不包括我在模块中分配的特定内存范围。这些内存范围对于调试并不重要,它们相当大(主要是纹理) 我已经阅读了有关函数的文档,并查看了由和结构提供的信息。MiniDumpCallback输入仅允许我决定是否包含可执行映像的内存范围,MiniDumpCallback输出允许我决定要为转储文件写入的范围 因此,我想知道是否可以创建一个小型转储,排除分配给某些超过大小限制的变量的内存范围。操作系统以页(通常为4KB)为单位分配内存,并且只能排除整个页面。变量可能在

更多信息:

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

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


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

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

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

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

尽管在实施这一目标方面做出了努力,但请考虑:

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