gpt4 book ai didi

.net - 调试时暂停, 'cannot evaluate expression'

转载 作者:行者123 更新时间:2023-12-01 21:48:37 24 4
gpt4 key购买 nike

使用 Visual Studio,在附加到进程并按“暂停”(全部中断)后,您可以切换到所需的线程并使用“快速监视”窗口来检查一些数据,例如

MySingletonClass.Instance.Data

有时我会得到这个:

Cannot evaluate expression because the current thread is in a sleep, wait, or join

或者这个(当尝试查看数据的某些属性时):

Cannot evaluate expression because a native frame is on top of the call stack.

坦白说,我不在乎,我只是想看看数据!我知道有多种方法可以解决这个问题,即:

  1. 在线程上设置断点并等待它被命中(很麻烦,并不总是可行)
  2. 转储进程并加载回 VS(即便如此,我仍然收到第二个错误)
  3. 风数据库

假设您可以看到这些数据,如果您可能使用了windbg,为什么我们在附加到进程时不能利用更简单、更漂亮的VS来检查对象?

最佳答案

为什么我们不能这样做?我们不能这样做是因为 Visual Studio 监 window 口不仅仅从内存中检索数据并显示它。它实际上执行托管代码(这就是“评估表达式”的含义)。特别是,它几乎总是执行 ToString() 方法来显示用户可读的结果。

关键在于它在您正在调试的进程/线程中执行此代码。这可以确保表达式的计算方式与您正在调试的代码中实际的计算方式相同。这留下了一个缺点,即它只能在托管指令之间执行,而不能在 native 代码处于事件状态时执行,并且不能在阻塞线程中执行。

对此我们能做些什么?如果您实际上正在调试托管应用程序,并且位于 native 堆栈框架中,只需重复按 F10 或 Shift+F11,直到返回托管代码。然后您可以评估表达式。但是,对于完全 native 进程以及处于阻塞状态的线程,我不知道有任何解决方法。

关于.net - 调试时暂停, 'cannot evaluate expression',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3626815/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com