欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C#回顾学习笔记二十五:程序员必备技能,调试

程序员文章站 2022-07-09 17:02:45
...
编写代码免不了会出现各种错误,在运行时会发现不是抛异常就是执行结果跟预期结果有差异。这时候就需要思考如何去解决这个问题。
首先应该清楚一点:代码都是从头开始,一句一句往下执行。程序员在发现代码有问题时,首先要想到的就是,这个错误可能发生在第几句代码。有经验的程序员找错误的位置很准,对于没有经验的程序员来说,可以从第一句代码开始检验错误。那么,如何检验错误?
一、普通的按一下F11执行。

平时运行程序按的F5,这样程序会自动运行所有代码。但如果按F11运行,程序则只会执行一句。再次按下F11程序才会又往下执行一句。按F11叫逐句调试。对于经验不足的程序员来说,一句一句执行,并用鼠标观察变量的值是否属于预期的值,是很适合入门的调试姿势。找错误实际上就是在调试过程中用鼠标去观察每个变量或对象的值是否属于预期的值,直到观察到认为不应该出现的值,那么就算找到了错误。

C#回顾学习笔记二十五:程序员必备技能,调试

如上图所示,在按F11键逐句调试的过程中,可以看到当前程序运行情况下变量的详细变化情况。“当前程序运行情况”指的是程序当前运行所在的位置,只有执行过的语句,才可以看到变量的值,而程序还没执行的部分,是看不到任何结果的,因为程序都还没有执行到那里。

二、普通的按一下F10执行。
同上面F11,也是单步执行。不同的是在遇到调用的方法时,按F11会进入方法内执行,而按F10则只会跳过方法的执行过程,直接执行完这个方法。按F10键叫逐过程调试

三、断点调试
断点调试是最常见的调试姿势。经验丰厚的程序员在发现程序有错误时,靠经验就可以大概确定错误的位置,并在那里设置好断点,此时再按F5执行,程序会自动运行到断点所在的代码并停在那里,等待着程序员的继续操作。断点调试就是给代码打上一个程序运行停止的标记,让运行的程序在看到标记后就暂停执行。

现在从一个实例,来演示“初次运行测试-怀疑有错-调试错误-修改错误-再次运行测试”这个过程。比如有如下代码,预期得到一个数组内成员相加的和,经验丰厚的程序员可能一下子就可以看出问题所在,但这里只是简单介绍调试的过程,程序员脑袋都在想什么。

第1步,写出代码,初次运行测试。代码如下所示:

class Program
    {
        static void Main(string[] args)
        {
            int[] nums = { 1, 3, 7, 12 };
            int sum = 0;//统计和
            for (int i = 0; i < nums.Length; i++)
            {
                sum = sum + nums[1];
            }
            Console.WriteLine("数组总和为{0}", sum);
            Console.ReadKey();
        }
    }
第2步,发现运行结果很奇怪,测试结果比预期结果还小很多,怀疑有错。如下图所示:

C#回顾学习笔记二十五:程序员必备技能,调试

第3步,调试错误,期望找到错误。

①初步分析,在声明数组没有问题,声明变量sum用来统计总和也没问题,那么错误可能出现在for循环内,因此先在for循环位置打上断点。如图所示,在红色箭头标记处打上断点:

C#回顾学习笔记二十五:程序员必备技能,调试

②按F5运行,让程序停在这里。并多次按F11逐句调试,让程序停止在红色箭头标记的位置,这样才能说明for循环内的语句已经被执行。程序停留的位置只是代表当前准备执行这一句,不是说已经执行过这一句,需要注意。如图所示,按F11让程序运行到这里。

C#回顾学习笔记二十五:程序员必备技能,调试

③分析sum = sum + nums[1];这一句,首次执行这一句时sum的值究竟是多少。将鼠标放到变量sum上,可以观察到当前sum值是多少。如图所示,用鼠标可以观察到sum当前值为3:

C#回顾学习笔记二十五:程序员必备技能,调试

④分析中:预期中sum第一次获得的值应该是数组第一个成员的值,但这里却是3,开始抱着怀疑的态度继续按F11运行,之后第二次运行sum = sum + nums[1];后观察发现,sum的值为6,因此怀疑是否每次循环都让sum的值加3了,而3是数组内第二个成员,数组下标是nums[1],然后发现错误出在sum = sum + nums[1];这一句。因为用的是nums[1],这使得每次循环都增加3。因此应该改为nums[i],这样每次循环才会依次加上nums[0]、nums[1]、nums[2]、nums[3]。

第4步,修改错误,将nums[1]改为nums[i];,如图所示:

C#回顾学习笔记二十五:程序员必备技能,调试

第5步,再次测试运行,感觉跟预期结果一样,完成调试过程。

C#回顾学习笔记二十五:程序员必备技能,调试