我正试图在Windows上隔离本机代码中的内存泄漏。
我运行了一个测试用例的多次迭代,并将DebugDiag附加到进程以收集有关可疑泄漏的信息(通过PerfMon中的多次运行确认内存泄漏)。
DebugDiag指出了可疑的调用堆栈,如
Call stack sample 1
Address 0x0f09e2c0
Allocation Time 00:22:38 since tracking started
Allocation Size 8.54 KBytes
Function Source destination
ntdll!RtlpReAllocateHeap+19c ntdll!RtlAllocateHeap
ntdll!_except_handler4
ntdll!RtlReAllocateHeap+22f ntdll!RtlReAllocateHeap
sqlncli11!MpReallocZeroMemory+66
sqlncli11!SQLReAllocateMemoryEx+22 sqlncli11!MpReallocZeroMemory
sqlncli11!AllocPlex+1a4 sqlncli11!SQLReAllocateMemoryEx
sqlncli11!SetADRec+2a4 sqlncli11!AllocPlex
sqlncli11!SQLBindCol+217 sqlncli11!SetADRec
odbc32!SQLBindCol+3c0
sscfdm!CSSLockSqlCursor::DoExecuteStmt+11a
sscfdm!CSSSqlCursor::Execute+129 sscfdm!CSSLockSqlCursor::DoExecuteStmt
sscfdm!CSSSqlObj::Execute+d86 sscfdm!CSSSqlCursor::Execute
sscfom!CSSBusComp::SqlExecute+3a sscfdm!CSSSqlObj::Execute
<<many multiple lines below>>
我已正确配置符号,现在我想知道如何从调用堆栈中提取更多信息。
UMDH日志的差异日志中也有行号(带文件名)。但是在DebugDiag报告中,我找不到这些函数的任何行号。如果函数真的非常长,那么通过仅查看调用堆栈而不使用行号来描述上下文变得困难。有什么办法可以从DebugDiag日志中提取函数(文件)的行号吗?
我想知道的另一件事是调用堆栈中每个module!function
条目的十六进制偏移的重要性。
调用堆栈中的分配大小是多少?它是否是每次执行此调用堆栈时未释放(因此泄漏)的已分配内存?
有关DebugDiag功能的综合文档的任何指示?
答案 0 :(得分:0)
UMDH日志的差异日志中也有行号(带文件名)。但是在调试诊断报告中,我找不到这些函数的任何行号。
那么,请使用UMDH日志。
调用堆栈中每个
is_expected
条目的十六进制偏移量的重要性。
十六进制偏移量指向已编译方法中的特定汇编器指令。它与源代码中的行号偏移大致相关,但可能会受到编译器优化的严重影响。
调用堆栈中的分配大小是多少?它是未分配的已分配内存...
是
...每次执行此调用堆栈?
没有。再次运行相同的方法可能会分配不同的大小。考虑像describe MyClass do
describe '#initialize' do
subject { -> { MyClass.new } }
it { is_expected.not_to raise_error(Some::Error) }
end
end
这样的函数,它取决于分配了多少内存的参数。
有关DebugDiag功能的综合文档的任何指针
抱歉,我无法提及一个好网站。