windbg dds-无法获取已分配内存的来源

时间:2018-07-04 17:44:26

标签: c++ memory-leaks windbg

我正在按照windbg.info上的说明尝试在程序中查找与内存分配/泄漏相对应的源。我设置了一个带有泄漏代码的测试用例,以尝试证明这一点。我可以找到其中的一部分,但看不到实际来源。

有问题的C ++代码是调试版本(优化已关闭等)。多次调用。

class test
{
public:
    int Allocate() 
    {
        pai = new int[128];
        pasz = new char[128];
    } 

private:
    int * pai = nullptr;
    char * pasz = nullptr;
};

我正在遵循windbg.info(缩短)上的指示:

  
      
  1. 要获取源信息,您还必须在步骤1中另外启用页面堆(gflags.exe / i MyApp.exe + ust + hpa)   ...
  2.   
  3. 执行!heap -flt s [大小]。 [Size] =先前确定的AllocSize。此命令将列出具有该特定大小的所有块。
  4.   
  5. 执行!heap -p -a [UserAddr]以从分配了那么多字节的位置获取堆栈跟踪。使用上一步中获得的[UserAddr]
  6.   
  7. 执行dt ntdll!_DPH_HEAP_BLOCK StackTrace [MyHeapBlockAddr],其中[MyHeapBlockAddr]是在步骤3中检索到的DPH_HEAP_BLOCK地址。
  8.   
  9. 执行dds [StackTrace]”,其中[StackTrace]是在上一步中检索到的值。   请注意,dds将转储包含源信息的堆栈。
  10.   

我确实正确加载了所有符号:

00007ff7`b1400000 00007ff7`b142b000   ConsoleApplication1 C (private pdb symbols)  c:\...
00007ff8`37ae0000 00007ff8`37c9e000   ucrtbased   (private pdb symbols)  c:\...
00007ff8`39d20000 00007ff8`39e16000   MSVCP140D   (private pdb symbols)  c:\...
00007ff8`40e30000 00007ff8`40e9e000   verifier   (private pdb symbols)  c:\...
00007ff8`40ec0000 00007ff8`40ee2000   VCRUNTIME140D   (private pdb symbols) c:\...
00007ff8`6a410000 00007ff8`6a62d000   KERNELBASE   (private pdb symbols) c:\...
00007ff8`6b4c0000 00007ff8`6b56c000   KERNEL32   (private pdb symbols) c:\...
00007ff8`6d9e0000 00007ff8`6dbb1000   ntdll      (private pdb symbols)  c:\...

我确实看到一个“好”堆栈,其中显示了对test :: Allocate的调用:

0:004> !heap -flt s 2034
_DPH_HEAP_ROOT @ 272d60e1000
Freed and decommitted blocks
  DPH_HEAP_BLOCK : VirtAddr VirtSize
Busy allocations
  DPH_HEAP_BLOCK : UserAddr  UserSize - VirtAddr VirtSize
    00000272d60ecf70 : 00000272d6467fc0 0000000000002034 - 00000272d6467000 0000000000004000

0:004> !heap -p -a  00000272d6467fc0 
address 00000272d6467fc0 found in
_DPH_HEAP_ROOT @ 272d60e1000
in busy allocation (  DPH_HEAP_BLOCK:         UserAddr         UserSize -         VirtAddr         VirtSize)
                         272d60ecf70:      272d6467fc0             2034 -      272d6467000             4000
...
00007ff7b14142a8 ConsoleApplication1!test::Allocate+0x0000000000000048
00007ff7b141495a ConsoleApplication1!main+0x000000000000008a
...

我以为我现在可以获取此内存分配的来源:

0:004> dt ntdll!_DPH_HEAP_BLOCK StackTrace 00000272d60ecf70 
+0x060 StackTrace : 0x00000272`d2f106d0 _RTL_TRACE_BLOCK

0:004> dds  0x00000272`d2f106d0 
00000272`d2f106d0  00000000
00000272`d2f106d4  00000000
00000272`d2f106d8  00008804
...

即使设置了“源文件路径”,也没有源。我还没有找到任何成功案例的例子。我在环境设置或命令中做错了什么吗?

windbg版本:6.12.0002.633 AMD64。 x64测试可执行文件。

1 个答案:

答案 0 :(得分:1)

dds d ump D WORD的命令,并解释为 s tack。这可能适用于32位应用程序。

您的应用程序是64位应用程序。我可以从00007ff7'b1400000之类的包含反引号的地址中看到这一点。因此,您应该使用dqs(转储四字并解释为堆栈)。

dps(转储指针的大小并解释为堆栈)会更好,因为根据应用程序的体系结构它将使用32位或64位。