12个Visual Studio调试效率技巧( 二 )


这样的返回值可以显示在调试->窗口->自动窗口中 。伪变量$ReturnValue也可以在即时窗口和监视窗口中使用,以方便查看最后一个函数调用的返回值 。
注意,菜单调试->窗口->自动窗口仅在Visual Studio调试器附加到进程并且程序被调试器暂停时可用 。

12个Visual Studio调试效率技巧

文章插图
 
9、重新附加到进程从Visual Studio 2017开始,重新附加到进程Shift+Alt+P工具被提出,并且非常方便 。将调试器附加到某个进程后,Visual Studio会记住它,并建议将调试器重新附加到同一进程 。斜体也一样,因为这里有一个关于进程标识的启发式方法:
  • 如果已附加的进程仍然运行着,重新附加到进程,重新附加到它 。
  • 否则,Visual Studio将尝试查找和前一个进程名具有相同名称的单进程,并将调试器重新附加到该进程 。
  • 如果找到几个使用此名称的进程,则打开“附加到进程”对话框,只显示名称相同的进程
  • 如果找不到具有此名称的进程,则显示“附加到进程”对话框

12个Visual Studio调试效率技巧

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

文章插图
 
下面这种动图是nse在监视窗口的使用 。由于SideEffectFct()所观察的项中有Refresh评估按钮,所以此示例比前一个示例更简单 。
12个Visual Studio调试效率技巧

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

文章插图
 
更多调试多线程应用程序的技巧可以在这个微软文档中找到: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 belowint j = i;// So 2 thread are blocked on '0' caseif (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代码中调试源代码我们经常依赖一些黑盒组件:我们没有源代码的组件 。
但是,在调试复杂行为时,观察甚至调试引用的黑盒组件引用的逻辑 。这就是为什么从16.5版本开始,Visual Studio 2019可以从编译好的程序中生成一些源代码 。这样的源代码是可以调试的 。这个特性是基于开源软件(OSS)工程:ILSpy(https://github.com/icsharpcode/ILSpy) 。
反编译菜单可以在模块窗口的组件右键菜单(如下面的动图所示)和Source Not Found或No Symbols Loaded对话框中给出 。
将IL代码反编译为源代码不可能是完美的,因为一些源代码信息在编译时丢失了 。因此,这个特性有一些限制,在这个官方文档的最后会解释:Generate source code from .NET assemblies while debugging
https://docs.microsoft.com/en-us/visualstudio/debugger/decompilation?view=vs-2019
12个Visual Studio调试效率技巧


推荐阅读