如何在 Visual C++ 中添加条件断点

Posted

技术标签:

【中文标题】如何在 Visual C++ 中添加条件断点【英文标题】:How to add a conditional breakpoint in Visual C++ 【发布时间】:2009-03-18 10:34:43 【问题描述】:

我想在 VC++ Express 2005 中的代码中添加断点条件,以便仅在局部变量满足指定条件时触发断点。例如

bool my_test(UIDList test_list) 
    foo(test_list);
    bar(test_list); // I have a breakpoint here, but only want it to trigger if test_list.Length() > 0
    print(test_list);

右键单击我的断点并选择“条件...”后,我发现一个对话框似乎可以执行我想要的操作,但是我尝试在文本字段中输入的任何内容都会导致以下错误:

无法评估断点 条件:CX0052:错误:成员 功能不存在

我尝试了帮助文档,但找不到答案。我希望有 VC++ 经验的人能指出我正确的方向......

我之前曾尝试升级到更新版本的 VC++ Express,但项目没有完全导入。由于项目的复杂性和我目前的时间尺度,我目前无法考虑将升级作为解决方案。

【问题讨论】:

【参考方案1】:

VS 确实有一些微观评估引擎——在可变观察窗口、即时窗口、断点条件等中。我永远找不到关于它们的像样的文档。据我所知,他们对愿意调用的方法很挑剔,他们也对访问限制不敏感。 因此,您可能可以从

重新表述您的情况
test_list.Length() > 0  

类似

test_list.m_nLength > 0

(或任何您的私有长度变量)。

(编辑)刚刚找到this msdn page 解释调试器可以处理和不能处理的表达式。所以首先,indeed -

'调试器可以访问所有类 成员不受访问控制。 您可以检查任何类对象 成员,包括基类和 嵌入的成员对象。'

其次,我对未能评估“Length()”的猜测 - 它可能是内联的:

'调试器表达式不能调用 内在或内联函数,除非 该函数至少出现一次 一个正常的功能。'

【讨论】:

【参考方案2】:

使用 DebugBreak();功能:

bool my_test(UIDList test_list) 
    foo(test_list);
    if (bar(test_list) /* or whatever check :) */) // I have a breakpoint here, but only want it to trigger if test_list.Length() > 0
        DebugBreak();
    
    print(test_list);

或者你总是可以使用断言(表达式)

bool my_test(UIDList test_list) 
    foo(test_list);
    bar(test_list);
    assert(test_list.Length() > 0); // will break here
    print(test_list);

【讨论】:

【参考方案3】:

据我所知,断点中的条件不能调用方法。所以,你需要做的是事先计算好长度。像这样。

bool my_test(UIDList test_list) foo(test_list); int i = test_list.Length(); bar(test_list); // I have a breakpoint here, but only want it to trigger if test_list.Length() > 0 print(test_list);

在这里对 i 的值设置一个条件断点应该没问题。

【讨论】:

以上是关于如何在 Visual C++ 中添加条件断点的主要内容,如果未能解决你的问题,请参考以下文章

使用 Visual Studio 调试器在值更改时中断

如何在 Eclipse 中使用条件断点?

如何在 Visual Studio 2019 中有条件地编译 c++ 源文件?

如何在 Visual Studio 2017 中修复断点表达式

Visual Studio 的 C++ 调试 - 向量大小变化的观察点

12个Visual Studio调试效率技巧