3

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

需要明确的是,我不是在寻找 Debugger.IsAttached。我正在寻找我会命名为“Debugger.IsPaused”的东西。有这样的东西存在吗?

我希望查看 CurrentThread 会发现一些东西,比如被命名为“调试器线程”或具有有意义的 ManagedThreadID,但线程未命名且托管线程 id 并不特殊。

4

1 回答 1

2

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

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

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

于 2013-09-04T08:12:01.803 回答