使用 Visual Studio,在附加到进程并按“暂停”(全部中断)后,您可以切换到所需的线程并使用“快速监视”窗口来检查一些数据,例如
MySingletonClass.Instance.Data
有时我要么得到这个:
无法计算表达式,因为当前线程处于睡眠、等待或连接状态
或这个(当尝试查看数据的某些属性时):
无法计算表达式,因为本机框架位于调用堆栈的顶部。
坦白说,我不在乎,我只想看数据!我知道有多种方法可以解决这个问题,即:
- 在线程上设置断点并等待它被击中(很麻烦,并不总是可行)
- 转储进程并加载回 VS(即使如此,我仍然收到第二个错误)
- windbg
给你could如果您可能使用过 Windbg,请查看此数据,为什么我们在附加到进程时不能利用更简单、更漂亮的 VS 来检查对象?
为什么我们不能这样做?我们不能这样做,因为 Visual Studio 监视窗口不仅仅从内存中检索数据并显示它。它实际上执行托管代码(这就是“评估表达式”的含义)。特别是,它几乎总是执行ToString()
方法来显示用户可读的结果。
关键是它执行了这段代码在您正在调试的进程/线程内。这可以确保表达式的计算方式与您正在调试的代码中实际的计算方式相同。这留下了一个缺点,即它只能在托管指令之间执行,而不能在本机代码处于活动状态时执行,并且不能在阻塞线程中执行。
我们对于它可以做些什么呢?如果您实际上正在调试托管应用程序,并且位于本机堆栈框架中,只需重复按 F10 或 Shift+F11,直到返回托管代码。然后您可以评估表达式。但是,对于完全本机进程以及处于阻塞状态的线程,我不知道有任何解决方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)