调试,不单纯只是发现问题,也可以帮助理解一些算法的执行流程,如快速、希尔排序、递归和回溯算法的分书问题。
要调试,就要有暂停点(因为语句执行速度太快了),也就是断点。
程序编译后就可以设置断点(在某行代码按F9,会看到一个深红色的大圆点,还多了一个黄色的箭头!这个黄色的箭头就是表示程序将要执行的语句!根据代码的逐行执行,黄色箭头相应移动。)。
并不是所有的代码行都可以设置断点,需要代码行有实际的指令动作。例如声明数据的代码并没有实际的指令动作,不能设置断点。
有了断点后,按F5键,并可将程序运行到断点。正如代码编辑、编译、连接有编辑器、编译器、连接器一样,调试也有IDE对应的一个调试器。
调试时可以调出众多类型的调试窗口,用于查看变量值、内存的数据位、堆栈函数逐层调用的情况,也可以查看对应的汇编代码,以及各寄存器的值。
我们知道,程序代码的主要模块是函数或类方法,由此,逐步调试可以逐条语句不进入函数内部进行调试,也可以逐条语句进入函数内部语句再逐语句调试。
一、常用调试命令
1.1 Insert / Remove Breakpointer (F9)
用于插入断点。
1.2 Restart (Ctrl+Shift+F5)
终止当前的调试过程,重新开始执行程序。
1.3 Stop debugging (Shift + F5)
停止调试,并执行完程序剩下的代码。
1.4 Break Execution
终止程序运行,进入调试状态,多用于终止一个死循环。
1.5 Apply code changes
当源程序在调试过程中发生改变,重新进行编译。
1.6 Show next statement
显示下一语句。
二、逐步调试
2.1 Step Into (F11)
单步执行【进入函数】,遇到子函数就进入并且继续单步执行(简而言之,进入子函数);
2.2 Step over (F10)
单步执行【跳过函数】,执行一行语句,不进入函数体内部。
在单步执行时,在函数内遇到子函数时不会进入子函数内单步执行,而是将子函数整个执行完再停止,也就是把子函数整个作为一步。在不存在子函数的情况下是和step into效果一样的(简而言之,越过子函数,但子函数会执行)。(相对于F11,当有输出函数时,F10可以直接输出而不进入,较方便。)
2.3 Step out (shift+F11 )
从函数体内部运行出来。当单步执行到子函数