[英]DebugDiag call stack does not display line number of functions in call stack
我试图隔离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功能的综合文档的指针?
UMDH日志的差异日志中也具有行号(带有文件名)。 但是,在调试诊断报告中,我找不到这些功能的任何行号。
好吧,然后处理UMDH日志。
调用堆栈中每个
module!function
条目的十六进制偏移的重要性。
十六进制偏移量指向已编译方法中的特定汇编程序指令。 它与源代码中的行号偏移量大致相关,但可能会受到编译器优化的严重影响。
调用堆栈中的分配大小是多少? 是分配的尚未释放的内存...
是
...每次执行此调用堆栈?
否。再次运行相同的方法可能会分配不同的大小。 考虑一个类似AllocateSomeMemory(int bytes)
的函数,该函数取决于分配多少内存的参数。
有关DebugDiag功能的全面文档的任何指针
抱歉,我不能提一个好的站点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.