我正在尝试调试打印机驱动程序中的内存泄漏。我很确定这是资源泄漏,而不仅仅是普通的内存泄漏,因为在 windbg 中使用 !heap -s 分析堆并没有显示任何增加。如何使用 windbg 监控其他类型的对象?GDI 对象和打开句柄的数量也没有增长,那会是什么?
内存泄漏的症状是私有字节增长到 180Mb,然后打印开始遇到随机问题。
我正在尝试调试打印机驱动程序中的内存泄漏。我很确定这是资源泄漏,而不仅仅是普通的内存泄漏,因为在 windbg 中使用 !heap -s 分析堆并没有显示任何增加。如何使用 windbg 监控其他类型的对象?GDI 对象和打开句柄的数量也没有增长,那会是什么?
内存泄漏的症状是私有字节增长到 180Mb,然后打印开始遇到随机问题。
可以直接调用VirtualAlloc
. 尝试使用!address -summary
. 更好的是,从旧资源工具包中找到 vadump.exe 的副本。它提供了更具可读性的细分。
通过比较两次运行 WinDbg!vadump
命令的输出,然后转储一些新分配的 RAM,您可能会得到一些线索。如果您有符号文件并使用该dps
命令转储 RAM,WinDbg 将显示每个 DWORD 的符号匹配项。换句话说,如果一个值在符号文件中有名称,您就会看到它。一个很好的例子是在使用 VTable 转储 C++ 对象时。VTable 有一个符号,所以你会看到它是什么类型。
最后但并非最不重要的一点是,您可以设置断点VirtualAlloc
并为每次调用转储堆栈。即使没有对 allocs 和 frees 进行严格比较,您也可能会注意到一个有趣的调用堆栈或分配大小。转储堆栈并继续的断点语法是
bp kernel32!virtualalloc "kb;g"
此外,在 VirtualAllocEx 上指定一个断点。AFAIK,大多数进程启动的 VAD 分配应该达到断点,除了那些在内核中实现的,例如文件映射 (CreateFileMapping/MapViewOfFile) 和可能LoadLibrary
的 .