从Visual Studio 2017末尾,重新附加到进程Shift+Alt+P工具被提出,并且十分方便。将调试器附加到某个进程后,Visual Studio会记住它,并建议将调试重视新附加到同一进程。斜体也一样,由于这里有一个关于进程标识的启示式办法:
假设已附加的进程依然运转着,重新附加到进程,重新附加到它。
否则,Visual Studio将尝试查找和前一个进程名具有相反称号的单进程,并将调试重视新附加到该进程。
假设找到几个运用此称号的进程,则翻开“附加到进程”对话框,只显示称号相反的进程
假设找不到具有此称号的进程,则显示“附加到进程”对话框
重新附加到进程也适用于触及多个进程的调试会话。在这种状况下,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;
}
}
}
12、从反编译的IL代码中调试源代码我们常常依赖一些黑盒组件:我们没有源代码的组件。
(责任编辑:admin)