在断点上记录调用堆栈和值?

时间:2013-02-16 10:17:39

标签: memory-leaks windbg breakpoints visual-studio-debugging callstack

背景

我正在尝试追踪内存泄漏问题,我知道(来自_CRT_DEBUG_MALLOC和MFC以及CRT的泄漏检测)内存泄漏的特定行,但由于这条线经常被调用,我不知道知道哪个电话实际泄漏。 Allocation-Number + __p__crtBreakAlloc()没有帮助,因为每次运行时分配编号都不同。

无论如何,到目前为止为背景。如果您认为我应该使用其他工具,请发表评论。如果的答案专注于实际问题而不是我的潜在问题,我将不胜感激,因为我发现它比泄漏本身更有趣(我会发现最终通过足够的戳)。

问题

有可能在WinDbg中(我很确定它不在VS中)有一个具有以下属性的断点:

  • 它没有破裂。 (所以这是一个“跟踪点”)
  • 点击时,会记录调用堆栈(最多一定深度)
  • 它还应记录一些全局状态(变量,可能只是内存地址的原始值)

这可能吗?怎么样?

3 个答案:

答案 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可以跟踪任意打开和关闭操作。