【发布时间】:2013-08-16 17:03:40
【问题描述】:
在 Visual Studio 中调试代码时,如果将鼠标悬停在某个属性上,则会执行该属性的主体。当该代码正在执行时,是否可以确定它是由于调试器而不是由于正常代码执行而执行的?
明确地说,我不是在寻找 Debugger.IsAttached。我正在寻找我会命名为“Debugger.IsPaused”的东西。有这样的东西吗?
我希望查看 CurrentThread 会发现一些信息,例如被命名为“调试器线程”或具有有意义的 ManagedThreadID,但该线程未命名且托管线程 ID 并不特殊。
【问题讨论】:
-
我对 C# 了解不多,但你不能做一些类似 if(thread == Debugger.CurrentThread) 的事情吗?
-
旁注:我相信“获取属性”的执行将在原始线程上完成,而不是“特殊调试器线程”。作为 hack,您可能可以尝试在属性代码中检查“我的调用堆栈看起来是否可疑”。
-
@AlexeiLevenkov 我喜欢检查可疑堆栈帧的想法,但遗憾的是堆栈在调试器中看起来与正常情况完全相同。
-
@Abe 我假设您在谈论 EnvDTE 调试器类型而不是 System.Diagnostics.Debugger?我希望在不必依赖 Visual Studio API 的情况下实现这一点,但出于好奇,我可能会对此进行研究。
-
Hmmm - VS 知道这一点(当使用即时窗口评估属性时,在堆栈跟踪中显示“评估:...”)但代码中的
StackTrace不知道。 :(