我正在尝试追踪内存泄漏问题,我知道(来自_CRT_DEBUG_MALLOC和MFC以及CRT的泄漏检测)内存泄漏的特定行,但由于这条线经常被调用,我不知道知道哪个电话实际泄漏。 Allocation-Number + __p__crtBreakAlloc()
没有帮助,因为每次运行时分配编号都不同。
无论如何,到目前为止为背景。如果您认为我应该使用其他工具,请发表评论。如果的答案专注于实际问题而不是我的潜在问题,我将不胜感激,因为我发现它比泄漏本身更有趣(我会发现最终通过足够的戳)。
有可能在WinDbg中(我很确定它不在VS中)有一个具有以下属性的断点:
这可能吗?怎么样?
答案 0 :(得分:1)
回答你的每个问题:
断点没有破坏:
bp myDll!<namespace>::myClass::myFunc "gc"
- 您可以执行用双引号分隔的命令,在这种情况下,当遇到断点时,只需继续
在命中断点时将调用堆栈转储一定深度
.kframes 0n50; bp myDll!<namespace>::myClass::myFunc "kb;gc"
- 这将调用堆栈长度设置为50(默认值为20),0n
告诉它我们是基于小数的。 bp
之后的双引号中的命令将转储调用堆栈,然后继续
记录一些全球状态
dt myVar
- 将显示全局变量,另外将使用d* myVar
dd myGlobalVar
确保pdbs没有剥离私有符号 - 您应该检查dt
的信息,因为有特定的开关来处理unicode字符串,深度等..此外,您可以轻松地观察监视窗口中的值在WinDbg中,另请参阅有关d*
此外,WinDbg中还有一个自动泄漏检测命令:
!heap -l
但我发现它有时会受到影响,更多信息here
答案 1 :(得分:1)
你正在尝试的是一种非常强力的方法,在处理内存泄漏时几乎没有积极的影响 - 至少像UMDH这样的东西是必要的,以应对基于堆栈跟踪跟踪泄漏的复杂性。即使你成功地采取了一些痕迹,你手动处理也可能过于冗长。
有一个通用的调试器扩展来跟踪所有类型的泄漏,如果你采用手动路线,这会给你一些影响:domdbg extension
我写了一个帮助python脚本,如果你去UMDH路径,你可能会发现它很有用 - 它可以帮助你自动拍摄快照,并且在分析跟踪时可以更有效率,因为它会缓存符号信息并将跟踪存储在二进制形式(与UMDH使用的文本表示相对):pyumdh
答案 2 :(得分:1)
还有tracer extension可以跟踪任意打开和关闭操作。