文章目录
安装
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 命令:所有线程执行特定命令