簡體   English   中英

如何從Visual Studio加載項中獲取正在運行的進程的堆棧跟蹤?

[英]How to get stack trace of a running process from within a Visual Studio add-in?

我在C#中編寫一個Visual Studio加載項,當我在同一個Visual Studio窗口中調試一個進程時,它將運行,我需要從我的加載項中訪問該進程的堆棧跟蹤。 我嘗試將此代碼放入我的加載項,但它返回加載項的堆棧跟蹤,而不是我正在調試的進程。

System.Diagnostics.StackTrace stacktrace = new System.Diagnostics.StackTrace(true);
System.Diagnostics.StackFrame stackframe = stacktrace.GetFrame(0);

任何幫助,將不勝感激。

最簡單的方法是通過DTE自動化對象向調試器詢問堆棧幀。 您可以通過加載項使用DTE對象。 您需要的屬性是Debugger.CurrentThread.StackFrames 如果您使用的是.NET 4,則可以執行以下操作:

    static string GetCurrentStackTrace(DTE dte)
    {
        bool canGetStackTrace =
            (dte != null) &&
            (dte.Debugger != null) &&
            (dte.Debugger.CurrentThread != null) &&
            (dte.Debugger.CurrentThread.StackFrames != null);

        if (!canGetStackTrace)
            return string.Empty;

        return string.Join(
            "\n",
            dte.Debugger.CurrentThread.StackFrames.Cast<StackFrame>().Select(f => f.FunctionName)
        );
    }

否則,你可以這樣做:

    static string GetCurrentStackTrace(DTE dte)
    {
        bool canGetStackTrace =
            (dte != null) &&
            (dte.Debugger != null) &&
            (dte.Debugger.CurrentThread != null) &&
            (dte.Debugger.CurrentThread.StackFrames != null);

        if (!canGetStackTrace)
            return string.Empty;

        StringBuilder stackTrace = new StringBuilder();

        foreach (StackFrame frame in dte.Debugger.CurrentThread.StackFrames)
        {
            stackTrace.AppendFormat("{0}\n", frame.FunctionName);
        }

        return stackTrace.ToString();
    }

痛苦和參與的方式是使用ICorDebugStackWalk64分別獲取托管和本機堆棧,然后手動將它們拼接在一起。 既然你是一個VS加載項,你也可以讓調試器為你做繁重的工作!

代碼正在按預期工作,因為當您調用代碼時,您的加載項(在VS下)是“當前進程”。

我不確定“當前正在運行的進程”是什么意思(你的意思是在VS下運行/調試進程嗎?),但我認為不可能獲得另一個進程的堆棧跟蹤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM