Linux 常用指令 五--GDB调试相关学习

GDB调试终究是不能逃过的一关啊,,,

gdb是linux下的一个调试工具,参考的是下面篇文章,对该文章进行了一些缩短,总结: https://www.cnblogs.com/kingos/p/4514756.html 如果博主不同意可以私信我删除,谢谢。

首先打开你的linux 终端,然后在上面输入:
gdb test1
然后你就会看到出现好多信息在屏幕上,大致说的是gdb的一些版本信息说明之类的,但是它对你调试程序没用呀,所以,你可以加上-q选项,不输出它们。
gdb -q test1

指令:list 显示固定行数的程序(默认10行),
list 默认参数可以用show listsize查看,如果感觉10行太少,
可以使用set listsize <行数>来更改。
list 相关的其他参数:
list 5,10 显示第5行到第10行的代码;
list func 显示func函数周围的代码,显示范围和list参数有关;
list test.c:5,10 显示源文件test.c第5行到第10行的代码,一般用于调试含多个源文件的程序。
gdb 还支持字符串查找,search str,从当前行开始,向前查找含str的字符串;
reverse-search str,从当前行开始,向后查找含str的字符串。
屏幕被占满想清空屏幕,还在gdb里面,gdb也支持运行linux命令的,可以在gdb的提示符中,输入shell,然后在输入你需要的命令就可以了。
(gdb) shell clear

如何设置断点:
(gdb) break (b) 6 在程序的第6行打断点调试

(gdb) break (b) ticm.cpp:125 当含有多个程序时,指定在某个程序的第几行打断点调试

(gdb) break 7 if n==6 根据条件加断点,如果n的值为6,则程序运行到第7行停止

断点打好以后显示我们之前打过的断点的信息:

(gdb) info breakpoints
Num Type Disp Enb Address What
1 breakpoint keep y 0x080484c8 in func at test.c:6
2 breakpoint keep y 0x080484d1 in func at test.c:7
stop only if n==6
4 breakpoint keep y 0x080484c1 in func at test.c:5
(gdb)

使断点失效: disable + 断点编号(注意不是断点行号),使用enable可以恢复。

删除断点: clear + 断点行号(或者设置断点的函数名)。
delete + 断点编号 ,可以一次删除多个断点,断点编号之间用空格隔开;如果delete后没有参数,默认删除所以断点,会给出提示选择是否操作。
delete 删除全部断点

其他参数含义:
run(r) 运行程序(r 后可以加参数,例如 r ind)
continue(c) 当程序在断点处停止后,执行该命令程序会继续运行,直到下一个断点处停止或者程序运行结束。
next(n) /step(s) 当程序在断点处停止后,执行该命令程序会继续运行,不同于continue,该命令使程序单步运行,每次只运行一句程序。
print + 变量名称 该命令会打印程序运行到该断点处后,变量的值变为了多少。
whatis 变量名或者表达式,可以显示该变量或表达式的数据类型。
(gdb) whatis width
type = double
(gdb) p width
$4 = 13
(gdb) set width=47
Invalid syntax in expression.
因为,set width是GDB的命令,所以,出现了“Invalid syntax in expression”的设置错误,此时,你可以使用set var命令来告诉GDB,width不是你GDB的参数,而是程序的变量名,如:
(gdb) set var width=47
另外,还可能有些情况,GDB并不报告这种错误,所以保险起见,在你改变程序变量取值时,最好都使用set var格式的GDB命令。

print 变量=值,可以给对应的变量赋值;类似还有set variable 变量=值。作用和用print赋值相同。
kill(k) 终止程序运行。
quit(q) 退出GDB。

(backtrace)bt:
打印当前的函数调用栈的所有信息: 参考博客https://blog.csdn.net/jzp12/article/details/7860706
(gdb) bt
#0 func (n=250) at tst.c:6
#1 0x08048524 in
main (argc=1, argv=0xbffff674) at tst.c:30
#2 0x40040Arrayed in __libc_start_main () from /lib/libc.so.6
从上可以看出函数的调用栈信息:__libc_start_main
–> main() --> func()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 u-boot 中使用 gdb 进行调试,需要进行以下几个步骤: 1. 在配置文件中开启调试信息选项。在 u-boot 的配置文件(比如 `include/configs/board.h`)中添加以下选项: ``` #define CONFIG_DEBUG_UART 1 #define CONFIG_DEBUG_UART_BOARD_DETECT #define CONFIG_SYS_DEBUG 1 #define CONFIG_SYS_DEBUG_UART CONFIG_DEBUG_UART #define CONFIG_DEBUG_LL #define CONFIG_GDB_PORT 6666 ``` 其中,`CONFIG_GDB_PORT` 指定了 gdb 调试器连接的端口号。 2. 编译 u-boot。在编译 u-boot 时需要开启调试信息选项,可以使用以下命令: ``` make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- <board>_defconfig make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all ``` 其中 `<board>` 为开发板的名称。 3. 烧录 u-boot 到开发板。将编译好的 u-boot 烧录到开发板中,可以使用 JTAG 调试器或者通过串口进行烧录。 4. 连接开发板和 host 机。通过串口连接开发板和 host 机,并使用以下命令启动 gdbserver: ``` arm-linux-gnueabihf-gdbserver :6666 ./u-boot ``` 其中 `./u-boot` 为编译好的 u-boot 的可执行文件。 5. 连接 gdb 调试器。在 host 机上打开一个新的终端窗口,使用以下命令连接到 gdbserver: ``` arm-linux-gnueabihf-gdb u-boot (gdb) target remote :6666 ``` 其中 `u-boot` 为编译好的 u-boot 的可执行文件。 6. 开始调试。使用 gdb 调试命令进行调试,比如设置断点、单步执行等。例如,设置断点可以使用以下命令: ``` (gdb) b main ``` 然后使用以下命令运行程序: ``` (gdb) c ``` 程序会在 `main` 函数处停下来,等待 gdb 命令
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值