我正在用C#编写一个Visual Studio加载项,当我在同一个Visual Studio窗口中调试一个进程时,它将运行,我需要从我的加载项中访问该进程的堆栈跟踪。我尝试将此代码放入我的加载项,但它返回加载项的堆栈跟踪,而不是我正在调试的进程。
System.Diagnostics.StackTrace stacktrace = new System.Diagnostics.StackTrace(true); System.Diagnostics.StackFrame stackframe = stacktrace.GetFrame(0);
任何帮助都将不胜感激。
答案 0 :(得分:4)
最简单的方法是通过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加载项,你也可以让调试器为你做繁重的工作!
答案 1 :(得分:-1)
代码按预期工作,因为当您调用代码时,您的加载项(在VS下)是“当前进程”。
我不确定“当前正在运行的进程”是什么意思(你的意思是在VS下运行/调试进程吗?),但我认为不可能获得另一个进程的堆栈跟踪。 / p>