是否可以确定当前线程是否是“调试器”?

时间:2013-08-16 17:03:41

标签: c# .net debugging

在Visual Studio中调试代码时,如果将鼠标悬停在某个属性上,该属性的主体将被执行。当该代码执行时,是否可以确定它是由于调试器而被执行而不是由于正常的代码执行?

要清楚,我不是在寻找Debugger.IsAttached。我正在寻找一些我称之为“Debugger.IsPaused”的东西。有什么相似的吗?

我希望查看CurrentThread会显示某些内容,例如命名为“Debugger Thread”或者具有有意义的ManagedThreadID,但该线程未命名且托管线程ID不是特殊的。

1 个答案:

答案 0 :(得分:2)

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

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

您可以在Mike Stall全面的CLR调试博客的相应类别中阅读更多关于funceval的信息:http://blogs.msdn.com/b/jmstall/archive/category/11475.aspx