如何在Visual Studio外接程序中获得断点/异常处的当前行号

本文关键字:异常 断点 Visual Studio 程序 | 更新日期: 2023-09-27 17:51:06

我正在摆弄Visual Studio插件API,试图看看我想做的事情是否可能。我现在正在做的一件事是:

    public void Exec(string commandName, vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled)
    {
        _applicationObject.Events.DebuggerEvents.OnExceptionThrown += DebuggerEvents_OnExceptionThrown;
        handled = false;
        if(executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault)
        {
            if(commandName == "MyAddin1.Connect.MyAddin1")
            {
                handled = true;
                return;
            }
        }
    }
    void DebuggerEvents_OnExceptionThrown(string ExceptionType, string Name, int Code, string Description, ref dbgExceptionAction ExceptionAction)
    {
        //how to get line number here?
    }

理想情况下,我希望能够获得当前函数和行号,无论何时异常抛出的程序正在调试。这可能吗?

如何在Visual Studio外接程序中获得断点/异常处的当前行号

这些信息显然是从调试信息中获取的。因此,它并不总是可用的,我想这就是为什么在这种情况下StackFrames对象不实现它是有意义的。

无论如何,要获得带有文件和行号信息(以及IL偏移量等)的堆栈跟踪,您必须在已调试的应用程序的上下文中动态执行代码。你可以用GetExpression来做这个。在简介:

var tmp = dte.Debugger.GetExpression(
    "new System.Diagnostics.StackTrace(true).ToString();", true);

这将返回一个带有堆栈跟踪的字符串,包括文件和行号…但是,您必须解析这个返回的字符串才能实际使用它,我认为这比更常见的

方法要慢得多