gpt4 book ai didi

memory-leaks - 在断点处记录调用堆栈和值?

转载 作者:行者123 更新时间:2023-12-02 00:11:44 25 4
gpt4 key购买 nike

背景

我正在尝试追踪内存泄漏问题,我知道(从 _CRT_DEBUG_MALLOC 和 MFC 以及 CRT 的泄漏检测)内存泄漏的特定行,但是由于经常调用此行,所以我不知道知道哪个调用实际上泄漏了。 Allocation-Number + __p__crtBreakAlloc() 没有帮助,因为它每次运行的分配编号都不同。

无论如何,背景介绍到此为止。如果您认为我应该使用其他工具,请发表评论。如果答案集中在实际问题上而不是我的潜在问题,我将不胜感激,因为我发现这比泄漏本身有趣得多(我最终会通过足够的探索找到它)。

问题

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

  • 它不会坏。 (所以这是一个“跟踪点”)
  • 命中时记录调用栈(达到一定深度)
  • 它还应该记录一些全局状态(变量,可能只是内存地址的原始值)

这可能吗?怎么办?

最佳答案

回答您的每个问题:

  • 断点不断:

    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

    确保 pdb 没有剥离私有(private)符号 - 您应该检查 dt 的信息因为有特定的开关来处理 unicode 字符串、深度等。此外,您可以在 WinDbg 的监 window 口中轻松观察值。 , 另请参阅有关 d* 的文档

此外,WinDbg 中还有一个自动泄漏检测命令:

!heap -l

但我发现它有时有点碰运气,更多信息 here

关于memory-leaks - 在断点处记录调用堆栈和值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14909188/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com