2013-08-16 82 views
3

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

要清楚,我不是在寻找Debugger.IsAttached。我正在寻找一些我将命名为“Debugger.IsPaused”的东西。有这样的事吗?我希望看到CurrentThread会揭示一些东西,比如被命名为“调试器线程”或具有有意义的ManagedThreadID,但该线程未命名,并且托管线程ID不是特殊的。

+0

我不知道很多关于C#,但你不能这样做,如果(线程==调试.CurrentThread)? – 2013-08-16 17:10:19

+3

备注:我相信“get property”的执行将在原始线程上完成,而不是“特殊调试器线程”。作为hack你可能会尝试检查“我的调用堆栈看起来可疑”属性的代码。 –

+0

@AlexeiLevenkov我喜欢检查可疑堆栈帧的想法,但遗憾的是堆栈在调试器中看起来与通常情况下完全相同。 – MarkPflug

回答

2

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

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

可以在迈克失速的综合CLR调试博客的相应类别阅读更多关于funceval更多:http://blogs.msdn.com/b/jmstall/archive/category/11475.aspx

+0

这是一个MSDN线程,其中Mike Stall回答了一个非常类似的问题:http://social.msdn.microsoft.com/论坛/ EN-US/8d9ad358-958d-45bf-b48e-4b356c606302 /如何-可以-I-告诉-IF-I-AM-存在所谓从 - funceval –

相关问题