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_enabled
在calling_function()
的第一行。
++bp_enabled
在calling_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 2008 或 Visual Studio 2010 中设置 JavaScript 断点