创建一个MiniDump,不包括运行时分配的内存范围
Create a MiniDump excluding a range of run-time allocated memories
更多信息:
我想使用MiniDumpWriteDump创建一个MiniDump文件,但不包括我在模块内分配的特定内存范围。这些内存范围对于调试并不重要,而且它们相当大(主要是纹理)。
我已经阅读了关于MiniDumpCallback函数的文档,并查看了输入和输出结构提供的信息。MiniDumpCallback输入只允许我决定是否包含可执行映像的内存范围,MiniDumpCallback输出允许我决定为转储文件写入的范围。
因此,我想知道是否有可能创建一个MiniDump,排除分配给超出大小限制的某些变量的内存范围。
操作系统以页为单位分配内存(通常为4 kb),并且只能排除整个页。变量可以在页的中间开始,在页的中间结束。其他变量可以在它之前和之后分配。所以你不能在变量的基础上排除内存
如果一个变量大于一个页面,并且它跨越整个页面,那么可以排除整个页面。但是,这将为您的回调例程做一些工作:
让我假设它不太可能有那么大的结构体。因此,具有这种大小的唯一可能变量是数组。您可以编写一个方法来分配数组并跟踪跨越整个页面的数组。在回调期间,您可以使用GetSystemInfo()确定页面的开始和结束,然后排除页面。
尽管要努力实现这一点,但请考虑:
- 磁盘空间现在很便宜。多几个MB或少几个MB没关系。购买一个磁盘比实现这样的行为要便宜。
- 崩溃转储压缩得相当好(至少我收到的那些)。如果您需要发送,请先将其压缩。
- 如果仍然不够小,您可以将大转储转换为小转储(例如再次在WinDbg和
.dump
中打开转储)并首先分析该转储。只有在需要的情况下,客户才需要将较大的文件发送给您。 - 远程调试。例如,客户可以在WinDbg中打开转储,启动调试服务器,您可以连接到它。 对于非常大的分配,c++堆管理器将直接调用VirtualAlloc()。如果内存区域大于512 MB, ProcDump之类的工具已经能够删除最大的分配(
-mp
开关)。(但请注意,ProcDump将不会发挥作用,如果你有自己的未处理的异常处理程序)相关文章:
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 如何在 android ndk 上链接 C 和 C++ 代码,以及 C 和 C++ 运行时库(包括 STL)?
- 函数在正常运行时不起作用,但在调试时起作用
- 在流体中更改 .fl 文件在使用 Visual Studio 运行时不会更改 UI
- 生成生成 makefile 时不包括 cmake C++11 标志
- 程序在运行时不执行任何操作
- 程序在运行时不会显示任何内容,只显示'0'值
- 为什么我的全球外部lambda变量在运行时不初始化
- 是否可以在析构函数运行时不销毁 obj
- 唯一的字符代码在 Linux 中运行时不起作用,但在 Windows (C++) 中很好
- C++11 在运行时不使用 switch 为元组编制索引的方法
- Visual Studio 2012中的运行时不匹配
- 为什么此代码在通过任务计划程序运行时不起作用
- rand() 在 C++ 中再次运行时不会更改值
- 链接时不包括宏定义
- 是否可以使您的Qt应用程序在运行时不锁定文件
- 程序运行时不会发生任何反应(并且不会创建窗口)
- 获取当前登录的用户名,C++作为服务运行时不显示任何内容
- 减法和晶圆厂工作,然后在程序运行时不工作
- 我的程序在运行时不会打印任何内容,输入几个随机数后它会工作(有很多错误)