Visual Studio的调试技巧

 

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

演示环境:

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;

效果如下:

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

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

给断点加条件

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

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

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

条件表达式:

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

命中次数:

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

筛选器:

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

多线程调试

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

查看所有线程当前位置

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

效果如下:

冻结一个线程

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

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

切换线程

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

 
分类: C# ASP.NET

VS2017调试技巧的更多相关文章

  1. Visual Studio高级调试技巧

    1. 设置软件断点,运行到目标位置启动调试器 方法①:使用汇编指令(注:x64 c++不支持嵌入汇编) _asm 方法②:编译器提供的方法 __debugbreak(); 方法③:使用windows ...

  2. 【工具】VS2010常用调试技巧(1)

    调试是一个程序员最基本的技能,其重要性不言自明.不会调试的程序员就意味着他即使会一门语言,却不能编制出好的软件.本文就本人在开发过程中常用的调试技巧作下简单呢介绍,希望对大家有所帮助,能力超群者请绕道 ...

  3. 【转】你所不知道的Android Studio调试技巧

    这篇写Android studio debug技巧个人觉得写得不错,转自:http://www.jianshu.com/p/011eb88f4e0d# Android Studio目前已经成为开发An ...

  4. VS调试技巧,提高调试效率(转):

    如果你还没有使用过这些技巧,希望这篇博文能帮你发现它们. 它们学起来很容易,能帮你节省很多时间. 运行到光标(Ctrl+ F10) 我经常看见人们是这样来调试应用程序的: 他们在应用程序需要调试的代码 ...

  5. iOS各种调试技巧豪华套餐

    转载自http://www.cnblogs.com/daiweilai/p/4421340.html 目录 前言 逼优鸡 知己知彼 百战不殆 抽刀断Bug 普通操作 全局断点(Global Break ...

  6. xcode调试技巧

    xode报错有时挺无厘头,完全不知道哪里出的问题,最后还得用排除法,记录一些工作中认为有用的调试技巧 1.左侧视图点断点视图,左下角点加号,选择exception breakpoint,类型选c++, ...

  7. 你所不知道的Android Studio调试技巧

    转载:http://www.jianshu.com/p/011eb88f4e0d Android Studio目前已经成为开发Android的主要工具,用熟了可谓相当顺手.作为开发者,调试并发现bug ...

  8. Visual Studio原生开发的20条调试技巧(下)

    我的上篇文章<Vistual Studio原生开发的10个调试技巧>引发了很多人的兴趣,所以我决定跟大家分享更多的调试技巧.接下来你又能看到一些对于原生应用程序的很有帮助的调试技巧(接着上 ...

  9. Visual Studio原生开发的10个调试技巧

    这篇文章只介绍了一些有关Visual Studio的基本调试技巧,但是还有其他一些同样有用的技巧.我整理了一些Visual Studio(至少在VS 2008下)原生开发的调试技巧.(如果你是工作在托 ...

随机推荐

  1. 理解Deadlock

    问:为啥以下代码会产生死锁 public class Deadlock { static class Friend { private final String name; public Friend ...

  2. C#ImageList和ListView的使用

    一.ImageList  ImageList组件,又称为图片存储组件,它主要用于存储图片资源,然后在控件上显示出来,这样就简化了对图片的管理.ImageList组件的主要属性是Images,它包含关联 ...

  3. java中的key事件监听机制

    package com.at221; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import javax.sw ...

  4. spring boot 配置多数据源

    https://www.jianshu.com/p/b2e53a2521fc

  5. Flip Game (高斯消元 || dfs)

    Flip game is played on a rectangular 4x4 field with two-sided pieces placed on each of its 16 square ...

  6. catch data

    抓取一些有反爬机制的website 喜马拉雅   每天都有-动态class 通过网络请求

  7. python学习教程,史上最全面的python学习路线图

    Python 是Web 开发.游戏脚本.计算机视觉.物联网管理和机器人开发的主流语言之一,随着Python用户可以预期的增长,它还有机会在多个领域里登顶.Python学习路线分享给你. 阶段一是Pyt ...

  8. Servlet+纯java+MySQL实现课程信息的增删改查

    Dbutil: package com.zh.util; import java.sql.Connection; import java.sql.DriverManager; import java. ...

  9. go 编译:交叉编译&编译执行过程

    1. 交叉编译 编译Windows程序和mac程序 GOOS=windows GOARCH-amd64 go build main.go 转自:https://www.cnblogs.com/mafe ...

  10. 剑指offer(51)构建乘积数组

    题目描述 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1].不 ...