我想在Visual Studio 2005中在非托管C ++中设置断点,但如果调用堆栈在特定函数中,我想忽略此断点。有没有办法做到这一点?
答案 0 :(得分:3)
如果您有Visual Studio的商业版,您应该能够在调用例程的早期设置断点,然后将其“When Hit ...”行为更改为“Run a macro”。您需要编写一个以编程方式禁用被调用函数中断点的宏 - 将其用作要运行的宏。 (希望其他人可以描述如何编写这样的宏。)然后在调用函数的所有出口点上设置其他断点,并更改其行为以重新启用被调用函数中的断点。
如果你有一个Express Edition,你会发现不幸的是,“运行一个宏”复选框是灰色的。在这种情况下,如果您有权访问调用函数的源代码,我建议如下:
int
变量bp_enabled
,最初设置为1。--bp_enabled
位于calling_function()
的第一行。++bp_enabled
位于calling_function()
的所有出口点。bp_enabled == 1
时中断。 (转到Debug | Windows | Breakpoints,然后右键单击断点。)有点黑客,但它完成了工作。
[编辑:已修复正常工作,即使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)
您可以在调用相关方法的所有行上放置中断(除了您不想停止的一个调用者例程)。如果从很多地方调用例程,或者以非显而易见的方式调用例程,我会发现这很难。
只是为了调试而更改代码似乎是最简单的 - 如果可能的话。