[英]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();
}
痛苦和參與的方式是使用ICorDebug
和StackWalk64
分別獲取托管和本機堆棧,然后手動將它們拼接在一起。 既然你是一個VS加載項,你也可以讓調試器為你做繁重的工作!
代碼正在按預期工作,因為當您調用代碼時,您的加載項(在VS下)是“當前進程”。
我不確定“當前正在運行的進程”是什么意思(你的意思是在VS下運行/調試進程嗎?),但我認為不可能獲得另一個進程的堆棧跟蹤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.