windBG DDS - 无法获取分配内存的源
windbg dds - unable to get source where memory allocated
>我正在按照 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 (gflags.exe/i MyApp.exe +ust +hpa 中另外启用页面堆( ...
- 执行 !heap -flt s [大小]。[大小]=之前确定的分配大小。此命令将列出具有该特定大小的所有块。
- 执行 !heap -p -a [UserAddr] 以从分配了这么多字节的位置获取堆栈跟踪。使用在上一步中获得的 [用户地址]
- 执行 dt ntdll!_DPH_HEAP_BLOCK StackTrace [MyHeapBlockAddr],其中 [MyHeapBlockAddr] 是在步骤 3 中检索到的DPH_HEAP_BLOCK地址。
执行 dds [StackTrace]- ",其中 [StackTrace] 是在上一步中检索的值。 请注意,dds 将转储包含源信息的堆栈。
我确实正确加载了所有符号:
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:...
我确实看到一个"好"堆栈,它显示了对测试的调用::分配:
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 测试可执行文件。
dds
是dumpDWORD的命令,并解释为stack。这可能适用于 32 位应用程序。
您的应用程序是 64 位应用程序。我可以从包含反引号的地址中看到00007ff7'b1400000
。所以你应该使用dqs
(转储四边形单词并解释为堆栈(。
更好的是dps
(转储指针大小并解释为堆栈(,因为它将使用 32 或 64 位,具体取决于应用程序的体系结构。
相关文章:
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- 给定一个指向堆分配内存的指针,智能指针实现如何为其找到合适的释放函数?
- 如果 const 不分配内存,为什么我可以获取 const 的地址?
- 在函数中分配内存时出现问题
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- constexpr new 如何分配内存?
- 在构造函数中分配内存失败是如何冒泡的
- LLVM 传递以在特定地址分配内存
- CudaMalloc 在分配内存时失败
- 为什么它在不分配内存的情况下工作正常
- 为什么在正确解除分配内存时出现内存泄漏?
- 如何通过 malloc 为队列数组分配内存?
- vector是否为std::移动的对象连续分配内存
- 删除类成员的动态分配内存的最佳方法是什么
- 唯一指针是否在堆或堆栈上分配内存?
- 如果不分配内存,我如何能够为变量创建和分配值?
- std::initializer_list 堆是否分配内存?
- 如何按顺序或在指定的地址分配内存?
- 是否可以使用 malloc 为类对象分配内存?
- 迭代器是否分配内存(如指针)?