Visual Studio:不包括特定函数调用的断点

时间:2009-01-16 13:35:09

标签: c++ visual-studio visual-studio-2005

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

4 个答案:

答案 0 :(得分:3)

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

如果你有一个Express Edition,你会发现不幸的是,“运行一个宏”复选框是灰色的。在这种情况下,如果您有权访问调用函数的源代码,我建议如下:

  1. 制作一个全局int变量bp_enabled,最初设置为1。
  2. --bp_enabled位于calling_function()的第一行。
  3. ++bp_enabled位于calling_function()的所有出口点。
  4. 将被调用函数中断点的“Condition ...”属性更改为仅在bp_enabled == 1时中断。 (转到Debug | Windows | Breakpoints,然后右键单击断点。)
  5. 有点黑客,但它完成了工作。

    [编辑:已修复正常工作,即使calling_function()恰好以递归方式(直接或间接)调用自身......]

答案 1 :(得分:0)

您可以在调用方法上放置DebuggerStepThrough属性,但这会阻止所有断点在调用方法上被触发,而不仅仅是特定方法

答案 2 :(得分:0)

更新: OP最初在开始时没有明确说明非托管C ++正在被使用。所以这个答案现在很无用,因为它只适用于托管代码。那就是说我会留下它以防万一有人绊倒它并发现它有用或者不了解JMC:

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

.NET 2.0引入了一个新属性:DebuggerNonUserCode。这与工具中的 Debug Just My Code 设置一起使用 - >选项 - > Debugging-> General->启用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");
}

答案 3 :(得分:0)

您可以在调用相关方法的所有行上放置中断(除了您不想停止的一个调用者例程)。如果从很多地方调用例程,或者以非显而易见的方式调用例程,我会发现这很难。

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