条件断点
本篇博客是VisualStudio断点调试系列文章的一部分,示例中使用的代码available to download。
在之前的博文里, 我们展示了命中断点和过滤器断点,他们可以帮助开发者缩小问题的范围。条件断点的也是相同的,但是能提供更多的灵活性,它允许开发者用任何有效的表达式来自定义条件。
我们举例说明一种条件断点的用法,这次使用C++例子。我们注意到我们的程序中有一个内测泄露,我们用条件断点帮助追踪它。程序的ddRef 和Release函数和一个对象有泄露,当程序在一个对象中调用AddRef次数比调用Release多时。我们要通过使用追踪点来追踪AddRef和Release函数。
在每一次经过这些追踪点时打印出ulcRef的值和当前的堆栈。
甚至不用到第二个追踪点,我能在这里看到我有很多信息。看倒两次调用AddRef 两次的 refcount的值 都是 1。这是因为我看到全部对象被AddRef调用所输出 。
为了缩小范围,我们设置一个条件断点在这个追踪点上以便于我只看发生泄漏对象的输出。然后,我们先通过在构造函数里设置一个断点来得到发生泄漏对象的内存地址。 这种情况下,我们设置一个命中计数断点因为我们只想准确命中一次。
现在得到了泄漏的对象地址,我们可以回到追踪点处添加一个条件。右击追踪点,点击 Condition…
然后设置这个条件匹配“this“的值,就是刚从构造函数中查到的值。
创建同样的条件给两个追踪点。现在当你继续执行,你可以看到刚刚那个对象的输出打印在Output window上。
就是这么简单的看到对象有两次调用AddRef 和一次调用release。基于堆栈还看到这个release是被destructor调用的,它是和第一个被destructor调用的AddRef 是一对的。这使得CleanUp 函数的AddRef 是额外的一个,需要被移除掉(或者给它调用个Release方法配成一对),到此为止我们的溢出问题解决了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!