gdb的简单使用

安装

yum install -y gdb

程序带调试信息的编译

程序必须以gcc -g的参数进行编译,否则无法使用gdb

gdb的使用

断点的增删改查

b 函数名 # 加断点-方式1
b 行号 # 加断点-方式2
info break # 查看所有断点
delete 断点编号 # 删除断点,不加编号是删除所有断点
disable 断点编号 # 禁用断点,而不是不删除
enable 断点编号 # 启用断点

给程序输入运行参数

相当于是argv[n]

1. gdb /usr/sbin/nfv_slb_sp # 进入gdb调试模式
2. set args -- -l 1-4 -w 0000:00:08.0 -w 0000:00:09.0 # 后面那一串作为参数输入,如果参数中包含特殊字符,那么可以把整个参数用双引号包起来
# 上面这步等效于/usr/sbin/nfv_slb_sp -- -l 1-4 -w 0000:00:08.0 -w 0000:00:09.0
3. show args # 查看运行参数

调试运行中的程序

1.1. gdb attach pid # 入侵正在运行的程序,此时程序会暂停,退出去之后,进程会继续跑
1.2. gdb 进程名 -p pid # 作用同1.1
2. 使用bt查看函数的调用栈

调试coredump文件

1. gdb 进程名 coredump文件名 # 打开coredump文件
2. 使用bt或where查看程序在哪一行出问题

调试多进程

如果是运行中的进程,我们能分别获取到父、子进程的pid,通过attach到不同的pid上,可以分别对父子进程调试

调试父进程

1. gdb 进程名
2. 设置断点
3. 此时父进程会暂停,子进程继续运行
4. gdb退出后,父进程停止,子进程变成孤儿进程继续运行

调试子进程

1. gdb 进程名
2. set follow-fork-mode child
3. 设置断点
4. 此时子进程会暂停,父进程继续运行
5. gdb退出后,子进程会退出,父进程在

设置调试模式

set detach-on-fork [on|off] # 默认是on,on表示调试当前进程的时候,其他进程继续运行;off表示调试当前进程的时候,其他进程被gdb挂起

显示当前进程信息

(gdb) info inferiors
  Num  Description       Executable
* 1    process 2591      /home/jiangxianqiang/github/jiangxianqiang/function/main5
#如果设置了set detach-on-fork off,gdb挂起父子进程,使用info inferiors就能看到两个进程信息
(gdb) info inferiors
  Num  Description       Executable
  2    process 2857      /home/jiangxianqiang/github/jiangxianqiang/function/main5
* 1    process 2853      /home/jiangxianqiang/github/jiangxianqiang/function/main5

进程间切换

(gdb) info inferiors
  Num  Description       Executable
  2    process 2857      /home/jiangxianqiang/github/jiangxianqiang/function/main5
* 1    process 2853      /home/jiangxianqiang/github/jiangxianqiang/function/main5
(gdb) inferior 2 #注意这边切换使用的是进程ID,不是linux的pid
(gdb) info inferiors
  Num  Description       Executable
* 2    process 2857      /home/jiangxianqiang/github/jiangxianqiang/function/main5
  1    process 2853      /home/jiangxianqiang/github/jiangxianqiang/function/main5

调试多线程

查看线程信息

ps -aL | grep 进程名 # 查看主线程和子线程
pstree -p 主线程id # 查看主线程和子线程之间的关系
  • info threads: 查看线程信息
  • thread 线程编号: 切换线程
  • set scheduler-locking on:只运行当前线程,其他线程被挂起
  • set scheduler-locking off:运行全部线程
  • thread apply 线程NUM 命令:仅对指定线程执行特定命令
  • thread apply all 命令:所有线程执行特定命令
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值