内容概要:
[1]GDB基本操作; [2]调试coredump; [3]GDB远程调试; [4]使用GDB的注意点; [5]GDB看不到源码
1. GDB基本操作
[root@WORK /]# ps -ef | grep -E 'fos_|p_|b_' --- 获取fos进程pid
[root@WORK /]# ps -a
[root@WORK /]# gdb attach <pid>
(gdb) help --- 万能的help!!
(gdb) thread apply all bt --- 打印本进程内所有调用栈信息
(gdb) thread 2 --- #[t 2], 切换到线程2
(gdb) bt --- 查看本线程调用栈
(gdb) frame 3 --- #[f 3], 查看第3层栈信息
(gdb) step --- #[s], 单步执行, 进入函数内
(gdb) next --- #[n], 单步执行, 不进入函数
(gdb) list --- #[l]
(gdb) b <func/file:line> --- 设置断点
break line-or-function if expr
(gdb) delete <breakpoints/no> --- 删除断点
enable/disable断点编号
(gdb) continue --- #[c]
(gdb) util <line-no> --- 顺序执行到某一行
(gdb) info local --- 查看函数栈中局部变量
(gdb) info args --- 查看参数值
(gdb) info breakpoints --- 查看断点信息
(gdb) print /x <var> --- #[p/x <var>], 查看变量内容,16进制
p/s *ptr_var --- 查看指针变量内容
p sizeof(struct) --- 查看结构体大小
(gdb) x/20x <addr.> --- 查看内存数据
(gdb) whatis <var> ---查看变量的类型定义
(gdb)
(gdb) cd <dir> ---切换到源码目录,方便在目标机器上调试
(gdb) gdb <.exe>
(gdb) run <paras.> --- !!!加上参数!!!
Ctrl+c
(gdb) Ctrl+z --- 调试程序后台stop
[root@WORK /] fg 1
(gdb) start
(gdb)
(gdb) handle SIG34 nostop noprint pass --- 解决线卡gdb时总是被其它信号打断方法
(gdb)
(gdb) set print pretty on ---打印显示结构体
(gdb) info proc ---查看进程文件和进程路径
process 5067
cmdline = 'cm_0_0_1'
cwd = '/home/xxx/vdev/r1/mpu_0_1/ld0/vd0'
exe = '/home/xxx/vdev/r1/mpu_0_1/ld0/vd0/run_ver/proc/xxx_container_x86_dbg'
(gdb)
(gdb)
2. 调试coredump
1)先保证程序crash时能生成coredump文件,导致其无法生成因素,最常见为文件限制:
[root@WORK /]# ulimit -c ---查看文件限制设置情况;ulimit -a
unlimited
[root@WORK /]# ulimit -c 256000000 ---指定一个较大数字,或unlimited
coredump文件一般生成在进程PID的运行目录,名称格式为core.PID
2)假如可执行文件名为prog.exe,产生的coredump文件名为core.2014,debug方法如下:
[root@WORK /]# gdb prog.exe core.2014
注:此处无需考虑prog.exe启动时的入参!!
[root@WORK ~]# sysctl -a | grep core_pattern ---查询
kernel.core_pattern = |/usr/libexec/abrt-hook-ccpp %s %c %p %u %g %t e
[root@WORK ~]# sysctl -a | grep core_uses_pid
kernel.core_uses_pid = 1
[root@WORK ~]# cat /proc/sys/kernel/core_pattern
core.%p
[root@WORK ~]# cat /proc/sys/kernel/core_uses_pid
1
[root@WORK ~]# sysctl -w "kernel.core_pattern=/home/db/fos/core.%p" ---配置[临时]
kernel.core_pattern = /home/db/fos/core.%p
[root@WORK ~]#echo 1 > /proc/sys/net/ipv4/ip_forward
[root@WORK ~]#sysctl -w net.ipv4.ip_forward=1
[root@WORK ~]#sysctl -p [/etc/sysctl.conf] ---使配置立即生效
#永久配置
[root@WORK ~]#vim /etc/sysctl.conf
3. GDB远程调试--NV
#在目标机上运行gdbserver
gdbserver 10.94.20.231:9000 main
#在调试机上运行gdb
gdb main
gdbserver 10.94.20.231:9000 main
break 16
r
4. GDB看不到源码--NV
在gdb下执行cd /home/src/code.c命令
5. 使用GDB的注意点
1)GDB某个进程,读不到动态库中的符号?
1) 确认进程中加载了该符号所在的动态库;
2) 若该符号在动态库中,确认该共享库被进程使用绝对路径加载。