更新时间:2023-02-27 13:34:59
您启发了我闲逛这一点 - 谢谢你让我整夜睡不着。 :)这里是你可以做这件事。
You inspired me to poke around with this - thanks for keeping me awake all night. :) Here's one way you can do it.
Visual Studio中有真正伟大的支持断点。一个冷却器特点是,你可以告诉它运行一个Visual Studio宏时断点被击中。这些宏有充分的机会来发展环境,即他们可以做任何你可以做手工键盘操作,包括设置其他断点。
Visual Studio has really great breakpoint support. One of the cooler features is that you can tell it to run a Visual Studio macro when the breakpoint is hit. These macros have full access to the development environment, i.e. they can do whatever you could do manually at the keyboard, including setting other breakpoints.
该解决方案是:1)把一个***的try / catch在你的程序来捕获所有异常,2)投入运行宏catch块一个断点,以及3)具有宏观看例外弄清楚它是从哪里来的,把一个断点在那里。当你在调试器中运行它,并发生异常,你就必须在code中的违规行一个新的断点。
This solution is to 1) put a top-level try/catch in your program to catch all exceptions, 2) put a breakpoint in the catch block that runs your macro, and 3) have the macro look at the exception to figure out where it came from, and put a breakpoint there. When you run it in the debugger and an exception occurs, you'll have a new breakpoint at the offending line of code.
取本示例程序:
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当你在调试器中运行,并得到该错误的断点。要做到这一点,首先要创建一个新的Visual Studio宏(我叫我的SetBreakpointOnException)。粘贴到一个新的模块MyDebuggerMacros或任何这样的:
The objective is to programmatically set a breakpoint on that throw
in func3 when you run it in the debugger and get the error. To do this, first create a new Visual Studio macro (I called mine SetBreakpointOnException). Paste this into a new module MyDebuggerMacros or whatever:
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
在这个宏到位,回到抓
块,并设置F9断点。然后右键单击红色圆圈断点,然后选择当打......。在出现的对话框的底部有一个选项,告诉它运行宏 - 下拉列表,选择你的宏。现在,你应该得到新的断点,当你的应用程序抛出未处理的异常。
Once this macro is in place, go back to the catch
block and set a breakpoint with F9. Then right-click the red breakpoint circle and select "When Hit...". At the bottom of the resulting dialog there's an option to tell it to run a macro - drop down the list and pick your macro. Now you should get new breakpoints when your app throws unhandled exceptions.
说明和警告一下:
希望这有助于!