【问题标题】:Is it possible to determine if the current thread is the "debugger"?是否可以确定当前线程是否是“调试器”?
【发布时间】: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 不知道。 :(

标签: c# .net debugging


【解决方案1】:

您无法确定您的进程是否在调试器中被停止,主要是因为您的代码没有被执行。

至于调试器 (Visual Studio) 中表达式值评估的特殊情况 - 会发生以下情况:您的进程的 active-in-debugger 线程被调试器劫持,然后由 Visual Studio 表达式评估器生成的一些代码被执行由你的线程。评估完成后,您的线程将再次停止,其状态与评估前一样保持不变。这个过程称为“funceval”。从理论上讲,您可以通过某种方式分析函数中的调用堆栈跟踪,以确定它是否通过 funceval 被调用,但我怀疑由于 CLR 调试器的非托管性质,这几乎是不可能的。

你可以在 Mike Stall 的综合 CLR 调试博客的相应分类中阅读更多关于 funceval 的内容:http://blogs.msdn.com/b/jmstall/archive/category/11475.aspx

【讨论】:

猜你喜欢
  • 2013-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-02
  • 1970-01-01
  • 2013-12-15
  • 1970-01-01
相关资源
最近更新 更多