Visual Studio:断点排除来自特定函数的调用

Posted

技术标签:

【中文标题】Visual Studio:断点排除来自特定函数的调用【英文标题】:Visual Studio: breakpoint excluding calls from a specific function 【发布时间】:2009-01-16 13:35:09 【问题描述】:

我想在 Visual Studio 2005 中的非托管 C++ 中设置断点,但如果调用堆栈位于特定函数中,我想忽略此断点。有没有办法做到这一点?

【问题讨论】:

哦....你的意思是如果在特定的调用者中忽略断点? 【参考方案1】:

如果您有 Visual Studio 的商业版,您应该能够在调用例程的早期设置断点,然后将其“当命中...”行为更改为“运行宏”。您需要编写一个宏,以编程方式禁用被调用函数中的断点——将其用作要运行的宏。 (希望其他人可以描述如何编写这样的宏。)然后在调用函数的所有退出点上设置其他断点,并更改它们的行为以重新启用被调用函数中的断点。

如果您有 Express Edition,您会发现“运行宏”复选框很遗憾是灰显的。在这种情况下,如果您可以访问调用函数的源代码,我建议如下:

    创建一个全局 int 变量 bp_enabled,初始设置为 1。 --bp_enabledcalling_function() 的第一行。 ++bp_enabledcalling_function() 的所有出口点。 将被调用函数中断点的“条件...”属性更改为仅在bp_enabled == 1 时中断。 (转到调试 | Windows | 断点,然后右键单击断点。)

有点小技巧,但它可以完成工作。

[编辑:即使calling_function() 碰巧递归调用自身(直接或间接),也可以正常工作...]

【讨论】:

如果您可以更改代码,应该有更简单的方法来实现这一点 - 但 j 的想法很好。【参考方案2】:

您可以在调用方法上放置DebuggerStepThrough 属性,尽管这将停止在调用方法上命中所有断点,而不仅仅是特定方法

【讨论】:

【参考方案3】:

您可以在所有调用您的方法的行上放置中断(除了在您不想停止的那个调用程序例程中)。如果从很多地方调用例程或以不明显的方式调用例程,我可以看到这很困难。

为了调试而更改代码似乎是最简单的——如果可能的话。

【讨论】:

【参考方案4】:

更新: OP 一开始并没有明确说明使用的是非托管 C++。所以这个答案现在非常没用,因为它只适用于托管代码。也就是说,我会留下它,以防有人偶然发现它并发现它有用或不了解 JMC:

虽然DebuggerStepThrough 仍然是防止单步执行代码的有效方法,但有时您确实想介入。这意味着必须找到并注释掉DebuggerStepThrough 属性。

.NET 2.0 引入了一个新属性:DebuggerNonUserCode。这与 Tools->Options->Debugging->General->Enable Just My Code 中的 Debug Just My Code 设置结合使用。

如果选中“仅启用我的代码”,则任何带有 DebuggerNonUserCode 属性的方法都不会被单步执行。如果您确实想定期重新启用标有DebuggerNonUserCode 的代码调试,则只需取消选中此设置。这样可以节省一些时间来查找和注释掉您通常不感兴趣的代码。

要使用任一属性,只需像这样装饰您选择的方法:

// The .NET 1.1 way
[DebuggerStepThrough]
public static void IgnoreMeAlways()

    Console.WriteLine("Hello...where is everybody!");


//The .NET2.0/VS2005/2008 way. Use in conjunction with Debug Just My Code
[DebuggerNonUserCode]
public static void NonUserCodeSomeTimes()

    Console.WriteLine("Longtime no see");

【讨论】:

是的......不幸的是。我猜你可能一直在使用托管 C++ 遗憾的是,我上次接触非托管 C++ 是在很久以前的 VS6 中,所以我怀疑我会不会有多大帮助:( 干杯露水....如果我知道它是非托管 c++ 我永远不会费心去做所有努力来实现负 1 :) 考虑一下 - 即使有了这个功能,我也不确定这对问题有什么帮助?? Ja....现在我又重读了几遍,看到 j 的回答我明白他现在的意思了。

以上是关于Visual Studio:断点排除来自特定函数的调用的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio调试之断点技巧篇

Visual Studio 快捷键

如何在 Visual Studio 2008 或 Visual Studio 2010 中设置 JavaScript 断点

在 Visual Studio (C++) 中设置断点问题

Visual Studio C++ 2005-2013 中的智能感知缺少函数定义

visual studio 的快键键(持续更新)