调试技巧是衡量程序员水平的一个重要指标.掌握好的调试技巧与工具的使用方法,也是很是重要的.程序员
VS2017
C#多线程
public class Program { private static int data { get; set; } = 0; public static void Main(string[] argv) { data = 10; new Thread(new ThreadStart(T1)) { IsBackground = true }.Start(); new Thread(new ThreadStart(T2)) { IsBackground = true }.Start(); Console.ReadKey(true); } private static int DataA { get; set; } = 0; private static int DataB = 0; private static void T1() { while (true) { DataA += 1; Thread.Sleep(1000); } } private static void T2() { while (true) { DataB += 1; Thread.Sleep(1000); } } }//End Class
这是最基本的操做了,想必大伙都会了...
咱们能够点击编辑器的这个地方:
给代码添加一个断点,这样当代码执行到这里的时候就会挂起进程,此时代码会暂停执行,并等待用户操做.编辑器
可按如下快捷键其中一个来实现继续:
F5(继续执行,直到再次遇到断点,或者按Ctrl+Alt+Break键强行中断)
F10(步过,继续执行,可是到下一行又会挂起,无论下一行有没有断点)
F11(步入,和步过同效,但若是当前挂起位置是一个函数的话,下一步会进到函数里)
Shift+F11(步出,执行到当前函数返回)函数
这个挂起,是对整个进程生效的,也就是说全部线程都会暂停.
挂起状态:
工具
如同图中那样,当鼠标指针指向变量名的时候,能够查看或修改该变量的值,修改完要按回车确认.
该操做仅限当前位置做用域内的变量.线程
看图中左边的小箭头,实际上是能拖动的!能够把他往上或往下拖,从而改变线程下一步要执行的代码位置,可是有两点要注意:
1:位置改变了,可是操做过的变量值不会改变,因此别期望能用来倒退已经执行过的操做.
2:改变是有范围的,不能跳到别的函数,就算是局部函数,也不能跳到外面.指针
有时候代码执行到某地方,某个变量就会被莫名其妙的改了.这时候咱们须要找出来是哪里改了这个变量.
VS有提供一个叫作[数据断点]的东西,但那个只支持native类的语言,C#是不行的.
但有个不是很完美的方法:
咱们能够给目标变量加上get;set;访问器,而后在上面加断点,看开头的代码:调试
private static int data { get; set; } = 0;
效果以下:
code
这时候按住Ctrl键不放,接着连续按D T键,就能呼出调用堆栈窗口,看是哪里在尝试修改这个变量,也能够按Shift+F11,执行到返回,这样就能直接跳到修改这个变量的代码:
说这个方法不完美是由于它对没有代码的其它dll里的全局变量没法使用.对象
当咱们在循环里打断点的时候,断点会被循环触发,这样调试起来就很麻烦了,咱们能够给断点加条件,让断点知足条件才触发.
按住Ctrl键不放,接着连续按D B键,能看到全部断点的列表.
在目标断点按下鼠标右键,在菜单里选择设置.可进入断点设置界面:
给条件打上勾.可看到有三种条件模板,三个模板可相与(竟然不能相或...)
能够输入一条表达式,以表达式的结果决定是否触发,表达式参数能够是当前断点做用域内的变量或常量,判断方式有两种:
表达式结果返回true时触发
表达式结果变化时触发(只支持bool类型结果)
提醒:若是想要在返回false的状况下触发,能够把表达式改成: !(表达式)
代码执行过断点次数达到必定次数才触发,这个模版分为三种类型:
等于:执行过第x次触发断点
大于等于:执行过第x次以及以后都触发
倍数于:代码执行过x的倍数次时触发断点
可根据线程ID,线程名,进程ID,进程名,机器名,等条件决定是否断下线程.各条件之间可进行逻辑操做
按住Ctrl键不放,接着连续按D T键,能显示[线程]窗口,可从中看到当前调试进程的全部线程.
点菜单栏的这个地方,能显示全部线程挂起时的位置:
效果以下:
这时候咱们能够单独冻结一个线程,让这个线程被单独挂起,其它线程继续调试,选择线程,而后点这里:
如你所见,解冻按钮就在旁边...
线程被冻结后,就会被单独挂起,直到解冻才继续执行.
若是当前挂起的线程不是本身要调试的线程,能够在这里切换到别的线程: