例如:
try
{
FunctionThatThrowsErrors(obj InscrutableParameters);
}
catch(Exception ex)
{
Log.LogTheError(ex);
AddBreakPointToCallingFunction();
}
这样一来,当你下次在调试时运行代码时,它将自动设置断点,在上一次运行中导致问题的所有点上。
我并不是说这是一种特别有用的调试方式。我只是想知道是否有这个能力。
try
{
FunctionThatThrowsErrors(obj InscrutableParameters);
}
catch(Exception ex)
{
Log.LogTheError(ex);
AddBreakPointToCallingFunction();
}
这样一来,当你下次在调试时运行代码时,它将自动设置断点,在上一次运行中导致问题的所有点上。
我并不是说这是一种特别有用的调试方式。我只是想知道是否有这个能力。
System.Diagnostics.Debugger.Break()
。Debug->Exceptions...
,并勾选当前仅勾选了“未经用户处理”的所有地方的Thrown
。#if (DEBUG) Debugger.Break(); #endif
中。 - Raheel Khan你的启发让我研究了一下这个问题,感谢让我彻夜未眠。 :) 下面是一种解决方法。
Visual Studio具有非常出色的断点支持。其中一个更酷的功能是,您可以告诉它在断点命中时运行Visual Studio宏。这些宏可以完全访问开发环境,即它们可以执行您可以手动在键盘上执行的任何操作,包括设置其他断点。
此解决方案的步骤如下:1)在程序中放置顶层try/catch以捕获所有异常,2)在catch块中放置断点以运行您的宏,3)使宏查看异常以确定其来源并在那里设置一个断点。当您在调试器中运行它并发生异常时,您将在有问题的代码行处有一个新的断点。
以这个示例程序为例:
using System;
namespace ExceptionCallstack
{
class Program
{
static void Main(string[] args)
{
try
{
func1();
}
catch (Exception e)
{
Console.WriteLine("Oops");
Console.ReadKey();
}
}
static void func1()
{
func2();
}
static void func2()
{
func3();
}
static void func3()
{
throw new Exception("Boom!");
}
}
}
目标是在调试器中运行并获取错误时,在func3的throw上编程设置断点。为此,首先创建一个新的Visual Studio宏(我称其为SetBreakpointOnException)。将以下内容粘贴到新模块MyDebuggerMacros或其他模块中:
Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports System.Diagnostics
Imports System.Text.RegularExpressions
Public Module DebuggerMacros
Sub SetBreakpointOnException()
Dim output As String = ""
Dim stackTrace As String = DTE.Debugger.GetExpression("e.StackTrace").Value
stackTrace = stackTrace.Trim(New Char() {""""c})
Dim stackFrames As String() = Regex.Split(stackTrace, "\\r\\n")
Dim r As New Regex("^\s+at .* in (?<file>.+):line (?<line>\d+)$", RegexOptions.Multiline)
Dim match As Match = r.Match(stackFrames(0))
Dim file As String = match.Groups("file").Value
Dim line As Integer = Integer.Parse(match.Groups("line").Value)
DTE.Debugger.Breakpoints.Add("", file, line)
End Sub
End Module
一旦这个宏放置好了,回到catch
块并使用F9设置一个断点。然后右键单击红色断点圆圈并选择“命中时...”。在结果对话框的底部,有一个选项告诉它运行宏-下拉列表并选择您的宏。现在,当您的应用程序抛出未处理的异常时,应该会得到新的断点。
关于此事项的说明和注意事项:
希望这可以帮助到你!
虽然这并不直接回答你的问题,但你可以使用Debug.Assert设置条件使得调试器在满足条件时中断。因此,你可以向函数添加断言,以在条件不符合预期时中断,而不是说“下次运行引发异常的函数时中断”,毕竟并不保证该函数这次一定会抛出异常,即使它上次抛出了异常。 :)
我不认为你真的可以“添加断点”,但是你可以通过调用System.Diagnostics.Debugger.Break()指示调试器暂停执行,以便检查出错的原因。
if (IsDebuggerPresent()) DebugBreak();
,我把它放在了我的几个异常类的构造函数中。 - Mooing Duck