Visual Studio的调试技巧

调试技巧是衡量程序员水平的一个重要指标.掌握好的调试技巧与工具的使用方法,也是非常重要的.
***

演示环境:

VS2017
C#
***

演示用的代码:

  1. public class Program
  2. {
  3. private static int data
  4. {
  5. get;
  6. set;
  7. } = 0;
  8. public static void Main(string[] argv)
  9. {
  10. data = 10;
  11. new Thread(new ThreadStart(T1)) { IsBackground = true }.Start();
  12. new Thread(new ThreadStart(T2)) { IsBackground = true }.Start();
  13. Console.ReadKey(true);
  14. }
  15. private static int DataA
  16. {
  17. get;
  18. set;
  19. } = 0;
  20. private static int DataB = 0;
  21. private static void T1()
  22. {
  23. while (true)
  24. {
  25. DataA += 1;
  26. Thread.Sleep(1000);
  27. }
  28. }
  29. private static void T2()
  30. {
  31. while (true)
  32. {
  33. DataB += 1;
  34. Thread.Sleep(1000);
  35. }
  36. }
  37. }//End Class

基本概念:断点

这是最基本的操作了,想必大伙都会了...
我们可以点击编辑器的这个地方:

给代码添加一个断点,这样当代码执行到这里的时候就会挂起进程,此时代码会暂停执行,并等待用户操作.

如何继续?

可按以下快捷键其中一个来实现继续:
F5(继续执行,直到再次遇到断点,或者按Ctrl+Alt+Break键强行中断)
F10(步过,继续执行,但是到下一行又会挂起,不管下一行有没有断点)
F11(步入,和步过同效,但如果当前挂起位置是一个函数的话,下一步会进到函数里)
Shift+F11(步出,执行到当前函数返回)

挂起的生效范围

这个挂起,是对整个进程生效的,也就是说所有线程都会暂停.
挂起状态:

在挂起的时候能做的事

查看或修改变量的值

如同图中那样,当鼠标指针指向变量名的时候,可以查看或修改该变量的值,修改完要按回车确认.
该操作仅限当前位置作用域内的变量.

控制线程下一步要执行的代码位置

看图中左边的小箭头,其实是能拖动的!可以把他往上或往下拖,从而改变线程下一步要执行的代码位置,但是有两点要注意:
1:位置改变了,但是操作过的变量值不会改变,所以别指望能用来倒退已经执行过的操作.
2:改变是有范围的,不能跳到别的函数,就算是局部函数,也不能跳到外面.

在数据被改变/读取的时候挂起(面向对象版数据断点)

有时候代码执行到某地方,某个变量就会被莫名其妙的改了.这时候我们需要找出来是哪里改了这个变量.
VS有提供一个叫做[数据断点]的东西,但那个只支持native类的语言,C#是不行的.
但有个不是很完美的方法:
我们可以给目标变量加上get;set;访问器,然后在上面加断点,看开头的代码:

  1. private static int data
  2. {
  3. get;
  4. set;
  5. } = 0;

效果如下:

这时候按住Ctrl键不放,接着连续按D T键,就能呼出调用堆栈窗口,看是哪里在尝试修改这个变量,也可以按Shift+F11,执行到返回,这样就能直接跳到修改这个变量的代码:

说这个方法不完美是因为它对没有代码的其它dll里的全局变量无法使用.

给断点加条件

当我们在循环里打断点的时候,断点会被循环触发,这样调试起来就很麻烦了,我们可以给断点加条件,让断点满足条件才触发.
按住Ctrl键不放,接着连续按D B键,能看到所有断点的列表.

在目标断点按下鼠标右键,在菜单里选择设置.可进入断点设置界面:

给条件打上勾.可看到有三种条件模板,三个模板可相与(居然不能相或...)

条件表达式:

可以输入一条表达式,以表达式的结果决定是否触发,表达式参数可以是当前断点作用域内的变量或常量,判断方式有两种:
表达式结果返回true时触发
表达式结果变化时触发(只支持bool类型结果)
提醒:如果想要在返回false的情况下触发,可以把表达式改为: !(表达式)

命中次数:

代码执行过断点次数达到一定次数才触发,这个模版分为三种类型:
等于:执行过第x次触发断点
大于等于:执行过第x次以及之后都触发
倍数于:代码执行过x的倍数次时触发断点

筛选器:

可根据线程ID,线程名,进程ID,进程名,机器名,等条件决定是否断下线程.各条件之间可进行逻辑操作
******

多线程调试

按住Ctrl键不放,接着连续按D T键,能显示[线程]窗口,可从中看到当前调试进程的所有线程.

查看所有线程当前位置

点菜单栏的这个地方,能显示所有线程挂起时的位置:

效果如下:

冻结一个线程

这时候我们可以单独冻结一个线程,让这个线程被单独挂起,其它线程继续调试,选择线程,然后点这里:

如你所见,解冻按钮就在旁边...
线程被冻结后,就会被单独挂起,直到解冻才继续执行.

切换线程

如果当前挂起的线程不是自己要调试的线程,可以在这里切换到别的线程:

(0)

相关推荐

  • 程序调试

    简介 本篇讲解在Idea中如何进行Debug. 程序调试 什么是程序Debug? Debug是程序开发人员必备的调试程序技能. 在企业中程序开发和程序调试的比例为1:1.5,是必须要掌握的技能. De ...

  • 使用 Visual Studio 进行调试

    您已经创建了应用程序并解决了生成错误. 现在,您必须纠正那些使应用程序或存储过程无法正确运行的逻辑错误. 可以用开发环境集成调试功能做到这一点.这些功能使您可以在某些过程位置停止执行,检查内存和寄存器 ...

  • visual Studio 无法调试,提示程序跟踪已退出

    今天在打码出现了vs无法调试,我在网上查了很久没有发现一个方法. vs点击启动时,出现了一下提示 程序"[12648] *.vshost.exe: 程序跟踪"已退出,返回值为 0 ...

  • 如何使用 Visual Studio Code 调试 Angular Schematics 实现

    How to Debug an Angular Schematic using Visual Studio Code 能够在代码执行时调试和遍历代码是我们开发工作流程的基础.这是一项必不可少的功能,使 ...

  • visual studio code 输出到“调试控制台”而不是“终端”

    visual studio code每次debug,默认会显示"终端窗口",但终端窗口会添加很多附属信息,比如启动的程序.参数等等. 但visual studio code的&qu ...

  • 【干货分享】非标自动化设备组装调试技巧学习

    玩转PLC工业机器人 垂直PLC领域,定期分享工业机器人.PLC.变频器.模拟量.定位控制.通信控制.HMI.行业资讯等工控技术,为广大工控人提供一个良好的学习交流平台. 83篇原创内容 公众号 小编 ...

  • Visual Studio Code 1.56稳定版发布

    白开水 OSC开源社区 昨天 文 | 白开水 出品 | OSC开源社区(ID:oschina2013) Visual Studio Code 1.56 稳定版已发布,其中一些主要亮点内容如下: 改进的 ...

  • 微软正式宣布 Visual Studio 2022

    首先,我们要感谢正在阅读这篇文章的你,我们所有的产品开发都始于你也止于你,无论你是在开发者社区上发帖,还是填写了调查问卷,还是向我们发送了反馈意见,或者参与了客户研究,感谢你帮助我们继续引导 Visu ...

  • 微软宣布Visual Studio 2022:10 篇热文汇总

    昨天 本文精选了DotNet 2021年04月份的10篇热门文章.其中有技术分享.技术资源. 注:以下文章,点击标题即可阅读 <微软正式宣布 Visual Studio 2022> 将会更 ...

  • Visual Studio Code出现乱码怎么办

    使用vscode打开记事本文档时,会出现如上图的乱码. VSCode通常默认UTF-8编码,打开"记事本"编辑的文本文件时会出现乱码,是因为Notepad在简体中文系统下,ANSI ...