GDB基本调试命令

内容概要:
[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) 若该符号在动态库中,确认该共享库被进程使用绝对路径加载。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值