https://www.cnblogs.com/darrenji/p/3900023.html#e
本篇体验Visual Studio的10个调试技巧,包括:
1、插入断点和断点管理
2、查看变量信息
3、逐语句F11,逐过程F10,跳出Shift+F11
4、查看堆栈信息
5、设置下一条执行语句
6、调试时修改局部变量并继续调试
7、线程管理
8、为断点设置条件
9、使用命令窗口测试方法
10、变量的历史记录
有这样的一个Person类:
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public bool IsOlderThanOrEqualTo()
{
if (Age >= 18)
{
return true;
}
else
{
return false;
}
}
public void PrintAge()
{
for (int i = 0; i < Age; i++)
{
Console.Write("*");
}
}
public int CalculateDogAge()
{
int dogAge = 0;
dogAge = Age*7;
return dogAge;
}
public void MethodA()
{
MethodB();
}
public void MethodB()
{
MethodC();
}
public void MethodC()
{
}
}
客户端调用:
class Program
{
static void Main(string[] args)
{
Person p = new Person();
p.Name = "darren";
p.Age = 22;
int a = 10;
//调试方法内
int result = p.CalculateDogAge();
Console.WriteLine(result);
//调试bool类型
bool olderThan18 = p.IsOlderThanOrEqualTo();
Console.WriteLine(olderThan18);
//调试遍历循环
p.PrintAge();
p.MethodA();
Console.ReadKey();
}
static int sum(int a, int b)
{
return a + b;
}
}
1、插入断点和断点管理
→右键代码行
→把鼠标移动到某代码行的任意位置,把鼠标移动到int result = p.CalculateDogAge();
→右键,断点,插入断点

→代码行左侧多了一个红色断点
● 也可通过在代码行的最左侧点击,添加断点。
● 可添加多个断点
● 还可通过:调试→窗口→断点,对断点进行管理
2、查看变量信息
→把鼠标移动到变量名上方
→给代码行打上断点后运行程序,运行程序,停留在断点行
→把鼠标移动到变量p的上方,点击+号可查看变量信息

也可点击菜单栏中:调试→窗口→自动窗口,在"自动窗口"中查看变量的动态信息。

还可点击菜单栏中:调试→窗口→局部变量,在"局部变量"中查看所有变量的动态信息。

还可点击菜单栏中:调试→窗口→监视→监视1,在"监视"中输入变量名并查看该变量的动态信息。

还可以右键变量名,点击"添加到监视"或"快速监视",以查看变量的动态信息。
3、逐语句F11,逐过程F10,跳出Shift+F11
使用逐语句F11调试,当执行某个方法,会跳转到方法内部。
使用逐过程F10调试,当执行某个方法,不会跳转到方法内部。
同时按Shift和F11,会跳转到当前执行方法的上一级中。
4、查看堆栈信息
在调试过程中,还可以查看堆栈信息。
→把断点打在int result = p.CalculateDogAge();代码行
→运行,起初停留在该行
→点击:调试→窗口→调用堆栈
→当没有进入CalculateDogAge方法内部时,调用堆栈窗口中指针指向Main方法

→当按F11使用逐语句调试,进入CalculateDogAge方法内部时,调用堆栈窗口中指针指向Person的实例方法CalculateDogAge

→当按F11使用逐语句调试,跳出CalculateDogAge方法,调用堆栈窗口中指针重新指向Main方法

5、设置下一条执行语句
调试时,左侧的黄色箭头图标表示下一条需要执行的代码行。我们可以通过拖动黄色箭头图标来重新设置应用程序的下一条执行语句。

6、调试时修改局部变量并继续调试
在调试过程中,当希望修改某个变量,但不想停止本次调试,再生成、调试,怎么办?Visual Studio现在允许在调试过程中修改某个变量,并继续调试。
但,此功能不适合64位计算机,如果64位计算机想使用此功能,需要做到:
→右键项目,点击"属性"
→点击"生成"
→在"目标平台"中,选择"x86"

另外,在调试过程中只能修改局部变量,如果想修改类名,方法名之类,需要停止当前调试再修改。
7、线程管理
在调试过程中,点击:调试→窗口→线程,可查看线程的动态信息。

8、为断点设置条件
→ 右键断点,点击"条件",输入如下:

也就是设置,当局部变量a为100时,才进入该断点。
→由于局部变量实际值是10,所有不会进入该断点,最终直接输出了结果。

9、使用命令窗口测试方法
点击:视图→其它窗口→命令窗口,输入如下:

10、变量的历史记录
有时候,希望把某一个变量在循环遍历过程中所有的值都记录下来。
class Program
{
static void Main(string[] args)
{
TestMakeObjectId();
}
private static void TestMakeObjectId()
{
List<string> strs = new List<string>();
strs.Add("Hello");
strs.Add("World");
foreach (string str in strs)
{
Console.Write(str + " ");
}
Console.ReadKey();
}
}
→在Console.Write(str + " ");代码行打上断点,运行。
→把鼠标移动到变量str上,右键,点击"添加监视",得到如下:

→右键监视窗口中变量str所在行,点击"创建对象ID"
得到如下:

→在监视窗口中另起一行,名称是1#,其对应的值自动变为"Hello",即记录下变量str在第一次遍历时的值。

→逐语句F11,str的值变成"World",1#的值不变。于是变量str在整个遍历循环过程中的值都被记录下来。

参考资料:
10+ powerful debugging tricks with Visual Studio
Advanced Debugging in Visual Studio