12个Visual Studio调试效率技巧(小结)
2020-07-08 13:02:55 来源:易采站长站 作者:刘景俊

重新附加到进程也适用于涉及多个进程的调试会话。在这种情况下, Visual Studio 会尝试使用上述相同的启发式方法来查找它附加到的所有进程。
10、在即时窗口和在观察窗口的 No-Side-Effect 评估
有时,在即时窗口或监视窗口中评估表达式时,某些状态会更改。这种行为通常时不希望发生的。你不想仅仅因为需要评估表达式的值而破坏调试程序的状态。这种情况被称为 Heisenbug ,该术语时物理学家 Werner Heisenberg 的双关语,它首先断言了量子力学的观察者效应,该现象指出,观察系统的行为不可避免的会改变器状态。
为了避免更改任何状态,你可以在表达式后面加上 nse (No-Side-Effect)。下面的动图说明了这种可能性(在监视窗口中监视 State 的值是否有变化)。

下面这种动图是 nse 在监视窗口的使用。由于 SideEffectFct() 所观察的项中有 Refresh 评估按钮,所以此示例比前一个示例更简单。

11、在源码中显示线程
调试多线程应用程序是有名的复杂。希望 在源码中显示线程 按钮能提供很大的帮助。它在编辑器的左侧边栏引入标记图标,以跟踪其他线程被暂停的位置。这个标记可以用来显示线程 ID ,并最终切换到另一个线程。注意:如果至少两个线程在同一位置暂停,则会显示不同的标记符号。

更多调试多线程应用程序的技巧可以在这个微软文档中找到: Get started debugging multithreaded applications (C#, Visual Basic, C++)
https://docs.microsoft.com/en-us/visualstudio/debugger/get-started-debugging-multithreaded-apps?view=vs-2019
下面是这个演示的源代码,如果你想演示它,可以进行参考:
using System;
using System.Threading;
class Program {
static void Main() {
for (int i=0; i< 5; i++) {
// Avoid capturing a loop variable in the lambda below
int j = i;
// So 2 thread are blocked on '0' case
if (j == 1) { j = 0; }
ThreadPool.QueueUserWorkItem(delegate { Method(j); });
}
Thread.Sleep(60000);
}
static void Method(int id) {
switch(id) {
case 0:
Thread.Sleep(60000); break;
case 1:
Thread.Sleep(60000); break;
case 2:
Thread.Sleep(60000); break;
case 3:
Thread.Sleep(60000); break;
case 4:
Thread.Sleep(60000); break;
}
}
}













闽公网安备 35020302000061号