代码之家  ›  专栏  ›  技术社区  ›  MK.

调试打印机驱动程序中的资源泄漏

  •  0
  • MK.  · 技术社区  · 15 年前

    我正在调试打印机驱动程序中的内存泄漏。我很确定这是一个资源泄漏,而不仅仅是一个简单的内存泄漏,因为分析堆时使用了!windbg中的heap-s没有任何增加。如何使用windbg监控其他类型的对象?GDI对象和开放句柄的数量也没有增长,那么它可能是什么呢?

    内存泄漏的症状是私有字节增长到180MB,然后打印开始遇到随机问题。

    1 回复  |  直到 9 年前
        1
  •  1
  •   Thomas Weller    9 年前

    可能是直接打给 VirtualAlloc . 尝试使用隔离内存类型 !address -summary . 更好的方法是,从旧的资源工具包中找到vadump.exe的副本。它提供了一个更可读的分解。

    通过比较两次运行windbg的输出,您可能会得到一些线索。 !vadump 命令,然后转储一些新分配的RAM。如果您有符号文件,并且使用 dps 命令,windbg将显示每个dword的符号匹配。换句话说,如果一个值在符号文件中有一个名称,您将看到它。一个很好的例子是当用VTables抛出C++对象时。vtable有一个符号,所以您将看到它是什么类型。

    最后但不是最不重要的,您可以在上设置断点 虚拟分配 并为每个调用转储堆栈。即使在allocs和frees之间没有严格的比较,您可能会注意到一个有趣的调用堆栈或分配大小。转储堆栈并继续的断点语法是

    bp kernel32!virtualalloc "kb;g"
    

    另外,在virtualallocex上指定断点。对于afaik,大多数进程启动的vad分配都应该达到临界点,除了那些在内核中实现的分配,例如文件映射(createfilemapping/mapviewoffile)和 LoadLibrary .