GDB单步执行程序

在调试程序时,存在很多的情况需要单步运行程序,就是一行一行的执行程序。例如程序中某一个范围中的代码都需要调试,如果每行都设置断点,使用时就会很繁琐,所以可以使用单步调试程序就会很方便。单行调试程序使用的命令是 next 和 step,下面是对这两个命令的详细介绍。

next命令

单步执行程序,当 next 命令执行遇到子函数时,不会进入到子函数内,而是将子函数全部执行结束再继续单步执行下面的代码,也就是把整个子函数的执行当作为一行代码来执行。在其他调试器中相当于 step-over,作用是在同一个调用栈中移动到下一个可执行的代码行,调用器不会进入到函数体。如果当前行是函数执行的最后一行则 next 将进入到下一个栈层,并在调用函数的下一行停止。

next 命令格式和使用方式:

next [count]

count 表示单步执行的次数,命令可以缩写为 n,如果在执行 count 次单步执行时,遇到一个断点或者是一个信号,单步执行会停止。实例:

(gdb) next 5

连续执行五次 next 命令。

step命令

单步执行程序,遇到子函数就进入到子函数中继续进行单步执行;在其他调试中相当于 step-into 命令,作用是移动到下一个可执行的代码行。如果当前是一个函数的调用,则调用器进入函数并且停止在函数中的第一行。step 可以帮助我们找到代码具体位置:函数调用和函数本体可能存在不同的文件中。。

step 命令格式和使用方式:

step [count]

count 单步执行的次数。如果在执行 count 次单步执行时,遇到一个断点或者是一个信号,单步执行会停止。实例:

(gdb) step 5

连续执行 5 次 step 命令。

是否跳过不含调试信息的调用函数,需要设置 step-mode。相关命令和使用方式为:

set step-mode [on/off]

系统默认的参数是 off,表示执行 step 命令时跳过不含有调试信息的调用函数。如果参数设置为 on,会在函数功能入口处停止。

显示设置的 step-mode 可以使用命令:

show step-mode

总结:step 命令和 next 命令的区别在于单步执行时遇到调用函数的处理情况,next 会当作一行代码处理,而 step 会进入到函数体中。其他的使用方式相同。