龙空技术网

GDB 的 7 个单步调试命令

硬核老王 630

前言:

此时我们对“gdb调试应用场景”大概比较重视,咱们都想要剖析一些“gdb调试应用场景”的相关内容。那么小编也在网络上汇集了一些有关“gdb调试应用场景””的相关文章,希望大家能喜欢,姐妹们一起来学习一下吧!

即使是复杂的函数,也有几种方法可以单步调试,所以下次在排除代码故障时,可以尝试一下这些 GDB 技术。

调试器是一个可以运行你的代码并检查问题的软件。GNU Debugger(GBD)是最流行的调试器之一,在这篇文章中,我研究了 GDB 的step命令和其他几种常见情况的相关命令。step是一个被广泛使用的命令,但它有一些人们不太了解的地方,可能会使得他们十分困惑。此外,还有一些方法可以在不使用step命令的情况下进入一个函数,比如使用不太知名的advance命令。

1、无调试符号

考虑以下这个简单的示例程序:

#include 

如果你在没有 调试符号debugging sysbols 的情况下进行编译(LCTT 译注:即在使用 gcc编译程序时没有写-g选项),然后在bar上设置一个断点,然后尝试在这个函数内使用step来单步执行语句。GDB 会给出一个 没有行号信息no line number information 的错误信息。

gcc exmp.c -o exmpgdb ./exmp(gdb) b barBreakpoint 1 at 0x401135(gdb) rStarting program: /home/ahajkova/exmpBreakpoint 1, 0x0000000000401135 in bar (gdb) stepSingle stepping until exit from function bar,which has no line number information.i = 20x0000000000401168 in main 

2、stepi 命令

但是你仍然可以在没有行号信息的函数内部单步执行语句,但要使用 stepi命令来代替step。stepi一次只执行一条指令。当使用 GDB 的stepi命令时,先做display/i $pc通常很有用,这会在每一步之后显示程序计数器program counter 的值和相应的机器指令machine instruction:

(gdb) b barBreakpoint 1 at 0x401135(gdb) rStarting program: /home/ahajkova/exmpBreakpoint 1, 0x0000000000401135 in bar (gdb) display/i $pc1: x/i $pc=> 0x401135 

在上述的 display命令中,i代表机器指令,$pc表示程序计数器寄存器(即 PC 寄存器)。

使用 info registers命令,来打印寄存器的内容,也是十分有用的。

(gdb) info registersrax 0x2 2rbx 0x7fffffffdbc8 140737488346056rcx 0x403e18 4210200(gdb) print $rax$1 = 2(gdb) stepi0x0000000000401139 in bar 1: x/i $pc=> 0x401139 

3、复杂的函数调用

在带调试符号的 -g选项,重新编译示例程序后,你可以使用行号在main中bar调用上设置断点,然后再单步执行bar函数的语句:

gcc -g exmp.c -o exmpgdb ./exmp(gdb) b exmp.c:14Breakpoint 1 at 0x401157: file exmp.c, line 14.(gdb) rStarting program: /home/ahajkova/exmpBreakpoint 1, main  at exmp.c:1414 bar(num);

接下来,用 step,来单步执行bar函数的语句:

(gdb) stepnum  at exmp.c:44 return 2;

函数调用的参数需要在实际的函数调用之前进行处理,bar函数的参数是num函数,所以num会在bar被调用之前执行。但是,通过 GDB 调试,你怎么才能如愿以偿地进入bar函数呢?你可以使用finish命令,并再次使用step命令。

(gdb) finishRun till exit from #0 num  at exmp.c:40x0000000000401161 in main  at exmp.c:1414 bar(num);Value returned is $1 = 2(gdb) stepbar (i=2) at exmp.c:99 printf("i = %d\n", i);

4、tbreak 命令

tbreak命令会设置一个临时断点。如果你不想设置永久断点,那么这个命令是很有用的。举个例子

标签: #gdb调试应用场景 #c语言bar #c语言断点调试怎么操作