Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以确定当前线程是否为;调试器;?_C#_.net_Debugging - Fatal编程技术网

C# 是否可以确定当前线程是否为;调试器;?

C# 是否可以确定当前线程是否为;调试器;?,c#,.net,debugging,C#,.net,Debugging,在VisualStudio中调试代码时,如果将鼠标悬停在某个属性上,将执行该属性的主体。当代码正在执行时,是否可以确定它是由于调试器而不是由于正常代码执行而执行的 说清楚,我不是在找Debugger.IsAttached。我正在寻找一个我可以命名为“Debugger.IsPaused”的东西。有这样的事吗 我希望通过查看CurrentThread会发现一些东西,比如被命名为“Debugger Thread”或者有一个有意义的ManagedThreadID,但是线程未命名,托管线程id也不特殊。您

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

说清楚,我不是在找Debugger.IsAttached。我正在寻找一个我可以命名为“Debugger.IsPaused”的东西。有这样的事吗


我希望通过查看CurrentThread会发现一些东西,比如被命名为“Debugger Thread”或者有一个有意义的ManagedThreadID,但是线程未命名,托管线程id也不特殊。

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

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


你可以在Mike Stall的综合CLR调试博客的相应类别中阅读更多关于funceval的内容:

我对C#了解不多,但你不能做一些类似if(thread==Debugger.CurrentThread)的事情吗?旁注:我相信“get属性”的执行将在原始线程上完成,而不是在“特殊的调试器线程”上完成。作为黑客,您可能可以尝试在属性的代码中检查“我的调用堆栈是否可疑”。@AlexeiLevenkov我喜欢检查可疑堆栈帧的想法,但遗憾的是,该堆栈在调试器中的外观与正常情况完全相同。@Abe我想您谈论的是EnvDTE调试器类型,而不是System.Diagnostics.debugger?我希望在不依赖Visual Studio API的情况下实现这一点,但出于好奇,我可能会研究一下。Hmmm-VS知道这一点(当使用即时窗口评估属性时,在堆栈跟踪中显示“求值:…”),但代码中的
StackTrace
不知道:(这里是一个MSDN线程,Mike Stall回答了一个非常类似的问题: