取决于分配大小的 VirtualAlloc 断点

Breakpoint for VirtualAlloc that depends on allocation size

我有一个 .Net 应用程序(Windows 服务)在一段时间后 运行 消耗大量非托管内存,直到因 OutOfMemoryException 崩溃。 this question 中的更多信息(已删除;仅限 10k 用户)。

我已经设法创建了一个 Supervisor 程序来扫描该应用程序的资源消耗,使用 VMMap 获取内存常规内存快照,并使用以下命令在 VirtualAlloc() 函数处设置断点(格式为可读性):

bp KERNELBASE!VirtualAlloc ".if (@rdx>=0x2FAF080) {
    .printf \"============Allocating %lu bytes  ================\n\", @rdx; 
    kb 8; !clrstack; gc
} .else{gc}"

但是 WinDBG 输出显示了一些奇怪的值,我无法跟踪 VMMap 显示的相同分配,所以我认为 RDX (source) 是一个错误的条件寄存器断点。

我需要设置一个正确的断点来跟踪非托管内存分配和堆栈跟踪,并最终找到有问题的代码。

更新: 这是带有本机堆栈的断点的示例输出。 我认为此处显示的字节数不准确,因为 VMMap 未显示该大小 (3.6GB) 的任何分配。 一件奇怪的事情是,该字节值显示在倒数第二个堆栈帧上,作为 clr!CExecutionEngine::ClrVirtualAlloc 的参数(参见 d8040000 值)。

============Allocating 3624140800 bytes  ================ 
RetAddr           : Args to Child                                                           : Call Site
00007ffe`5844395a : 00000001`111bf000 00000000`d2cb8000 00000000`00a229da 00000000`5ff17000 : KERNELBASE!VirtualAlloc
00007ffe`584adf14 : 00000000`00000004 00000000`00000000 00000000`d8040000 00000051`000fcbf0 : clr!CExecutionEngine::ClrVirtualAlloc+0x4a
00007ffe`589da6c7 : 00000000`00000000 00000000`00100000 00000051`80490000 00000051`000fcbf0 : clr!ClrVirtualAlloc+0x3c
00007ffe`589da270 : 00000000`00000000 00000051`000fcdc8 00000051`80490000 00000000`0006e120 : clr!WKS::gc_heap::grow_brick_card_tables+0x177
00007ffe`589d9ee4 : 00000000`08000000 00000000`00000023 00000000`00000000 ffffffff`fffffff8 : clr!WKS::gc_heap::get_segment+0x140
00007ffe`589dae9e : 00000000`08000000 00000000`00000000 00000051`000fcde0 00000051`000fcdb0 : clr!WKS::gc_heap::get_large_segment+0x204
00007ffe`58829226 : 00000000`0000000c 00000000`00000000 00000000`00000000 00000000`00000000 : clr!WKS::gc_heap::loh_get_new_seg+0x5e
00007ffe`585313b1 : 0000fffc`00000003 00000000`00000003 00000000`00000003 00000000`0006e138 : clr!WKS::gc_heap::allocate_large+0x2f8156

经过@ThomasWeller的评论,我猜断点确实是正确的。

关于内存问题,我已经联系了微软支持,他们确实找到了一块内存,但全是零!不过,我还没有找到该行为的具体原因。

因为这个问题的主题是关于断点的准确性,所以我现在关闭这个话题。