我正在调试转储文件,同时我可以访问符号文件。
我正在使用一个脚本,它结合了以下windbg
命令的结果:
x /2 *!* // which types are present in the symbol files?
!heap -h 0 // which memory address ranges are used in the dump?
(至少,我是这么理解的。如果我错了,请毫不犹豫地纠正我)
脚本的结果(称为heap_stat.py
,可在此 Windbg 扩展列表下找到)是内存地址列表,后跟它们的类型。如果存在内存泄漏,我可以通过统计这些数据得出。
最重要的是,使用提到的内存地址的 WinDbg 命令dt CStringArray m_nSize
(当然,在 a 的特定情况下CStringArray
),我可以看到已使用对象的条目总数CStringArray
,并查看是否存在CStringArray
具有大量条目的对象。
然而,这个系统有一个缺点:
当我发现这样一个CStringArray
有很多条目的对象时,我会卡在那里,因为CStringArray
在我的应用程序中的所有对象中,我不知道我正在处理哪一个。
可能有帮助的一件事是内存地址所在的局部变量的名称,但有一个问题:我不知道此信息是否存在,如果是,我可以在符号文件或转储中找到它,以及(显然)我需要运行哪个命令才能获取此信息(我没有找到一个标志可以dt <flag> <memory address>
返回局部变量名称,由 占用<memory address>
)?
有谁能够帮我?
为澄清起见,这就是我的脚本的结果当前的样子:
0x0065a4d0 mfc110u!CStringArray Size:[1]
0x0065a4e4 mfc110u!CStringArray Size:[0]
0x0065a4f8 mfc110u!CStringArray Size:[295926]
0x0065a520 mfc110u!CStringArray Size:[0]
如您所见,我可以看到存储变量的内存地址,可以看到类型(从符号文件中检索),并且可以看到条目数量(从dt
Windbg
命令中检索),但我想有如下输出:
0x0065a4d0 mfc110u!CStringArray Size:[1] var1
0x0065a4e4 mfc110u!CStringArray Size:[0] var2
0x0065a4f8 mfc110u!CStringArray Size:[295926] var3
0x0065a520 mfc110u!CStringArray Size:[0] var3
或者:
0x0065a4d0 mfc110u!CStringArray Size:[1] obj1.prop1
0x0065a4e4 mfc110u!CStringArray Size:[0] obj2.prop1
0x0065a4f8 mfc110u!CStringArray Size:[295926] obj1.prop2
0x0065a520 mfc110u!CStringArray Size:[0] obj1.prop2
这样的输出将表明我需要验证源代码var3
或obj1.prop2
源代码中发生了什么。