简图记录-GDB调试基础

目录

一、概念

二、GDB基础命令介绍

1、 带-g编译.c文件得到可调式程序。

2、gdb启动(可绑定PID) 与 退出 调试程序

3、基本运行命令-run(r)/continue(c)/finish(f)/step(s)/next(n)/until(u)/return

4、停止点指令-查看info/添加break watch catch/删除clear delete/使能enable disable

5、查看指令-源码list(l)/运行数据print(p) 修改set/栈内容backtrace(bt)/寄存器/内存

6、自动显示命令 display


一、概念

GDB: GNU开源组织发布的类unix环境上 ,针对待调试信息的可执行文件(编译带-g参数)调试工具。一般情况是针对c/c++可执行文件进行调试。

功能介绍:主要提供了各类运行指令和停止点进行程序执行控制,提供程序状态(变量/表达式)、栈信息、寄存器、内存的内容查看

重复执行:直接回车,表示重复上一次操作命令;

日志管理(默认关闭、不覆盖)

1、开关日志 set logging on/off  2、修改日志名 set logging file wuya.txt 

3、查看日志状态show logging 4、设置日志覆盖 set logging overwrite on/off

停止点概念:gdb有多种方式方便暂停运行,比如 (主动设置在某行、某函数、某地址处,可以设定暂停条件)断点breakpoints、(观察表达式变化,当某个表达式被读写时)观察点watchpoints 、(事件如异常 、库加载卸载等发生)捕获点catchpoints

栈信息与frameinfo栈帧:gdb把每次函数调用产生的栈内容为1帧frame,从栈顶开始按0给帧编号。

二、GDB基础命令介绍

以下操作以a.c实现举例:

int test_func(int start_pos, int end_pos)
{
    int sum = 0;
    int i;
    for (i = start_pos; i < end_pos; i++) {
	sum += i;
        printf("sum %d i %d\n", sum, i);
    }
    return sum;
}


int main(void) {
    int i = 10;
    int j = 15;
    printf("sum = %d from %d to %d\n", test_func(i, j), i, j);
    return 0; 
}

1、 带-g编译.c文件得到可调式程序。

goodboy@ubuntu:~/gdb_test$ gcc -g a.c #带调试参数-g编译.c文件
goodboy@ubuntu:~/gdb_test$ file a.out
a.out: ELF 64-bit LSB  executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0307a6916b9aea2428309ce5c5c33c044d2df27f, not stripped

2、gdb启动(可绑定PID) 与 退出 调试程序

启动方式:1、直接启动 gdb test; 2、带core文件启动 gdb test core.txt; 3、通过绑定进程号调试 gdb test 5;

退出方式:q或者quit

启动后,程序进入gdb调试界面,等待用户输入

goodboy@ubuntu:~/gdb_test$ gdb a.out 
GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.3) 7.7.1
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from a.out...done.
(gdb) 

3、基本运行命令-run(r)/continue(c)/finish(f)/step(s)/next(n)/until(u)/return

启动程序运行: run [启动参数]

继续执行:(到下一个停止点)continue [忽略停止点数];  (到函数尾)finish 

单步执行:(单步)step [步数] ;(单步且不进入调用函数)next [步数] ;(不进入函数且不在循环停止)until [步数]

中断当前函数立即返回执行:return [返回参数]

设置运行参数:set args XXXX;查看show args

4、停止点指令-查看info/添加break watch catch/删除clear delete/使能enable disable

分类断点breakpoints(主动设置在某行、某函数、某地址处)、观察点watchpoints(当某个表达式被读写时) 、捕获点catchpoints(事件发生)。

查看停止点info:info breakpoints / info watchpoints / info catchpoints

添加停止点

(1)添加断点:break(b) [位置信息](可为[文件名:]行号; [文件名:]函数名 ;+行号位置偏移;-行号位置偏移;*地址

(2)添加条件断点:break 位置信息 if 条件

(3)添加观察点:(表达式值变化)watch 表达式;(表达式被读)rwatch 表达式;(表达式被读写)awatch 表达式

(4)添加捕获点:catch 事件(可为 throw异常抛出 catch异常捕获 excec/fork/vfork对应函数调用 load/unload [库名]库加载卸载

(5)添加一次捕获后自动消除捕获点:tcatch 事件

删除方法:停止点删除方式一样,通过clear 函数名/行号 清除指定处停止点、delete 停止点号 删除对应编号停止点、enable/disable 停止点号 进行使能去使能

5、查看指令-源码list(l)/运行数据print(p) 修改set/栈内容backtrace(bt)/寄存器/内存

(1)查看源码 list [显示位置] (缺省表示继续显示当前位置)

位置可为:[文件名:]行号 指定文件指定行号位置;[文件名;]函数名 指定文件指定函数位置;+[偏移量] 往下偏移处继续显示;-[偏移量] 往前继续显示;

设置显示行数:set listsize 行数

搜索源码:1、全部搜索 search 表达式 2、正向搜索 forword-search 表达式 3、反向搜索 reverse-search 表达式

(2)查看运行数据 print [/指定打印格式] 表达式

表达式可为:变量名(防止重名覆盖 文件名::变量名 函数名::变量名);算术表达式;预处理宏名;数组(a[0]@10表示打印a[0]开始10个元素)

打印格式可为:x十六进制 o八进制 t二进制 d十进制 u无符号十进制 a地址形式 c字符 f浮点

自动打印(设置后可以在可见时自动打印):display 变量名 (查看 info display ;删除 undisplay 变量名)

(修改变量 set 变量名=值)

(3)、栈内容 backtrace / info frame / info args/ info locals

gdb把每次函数调用产生的栈内容为1帧frame,从栈顶开始按0给帧编号

打印调用栈backtrace [打印层次-缺省全部] ,(-n表示从栈底  full打印调用和变量)

打印帧信息info frame [帧信息层次](默认为栈顶序号0帧),调整栈帧位置,通过: up 上移动编号/down 下移动编号 

打印当前帧信息(包括帧地址、调用地址、函数入参地址和值)

打印当前帧 函数参数:info args / 打印当前帧 局部参数:info locals

(4)、寄存器 info register/all-register

打印非浮点非向量寄存器: info register ;打印所有寄存器: info all-register;打印指定寄存器: info register 寄存器名

(5)、打印内存 x/[长度 格式 每段大小] 地址

x/[内存长度n 显示格式f 多少字节作为值显示u ] 地址

显示格式 和 print格式一致;

多少字节作为值显示:w 4字节(默认)、b 1字节、h 2字节、g 8字节

如 x/4uw 0x123456 (从0x123456地址开始打印4个地址,每个地址按4字节打印内容,打印格式按无符号十进制)

6、自动显示命令 display

可以设置一些变量自动显示,当程序暂停住,或者单步调试时,会自动显示出来。

display [表达式]; display /[显示格式] [表达式];display /[显示格式] [地址];

相关命令:info display查看自动显示信息(带编号),undisplay [编号];delete display [编号];enable display [编号]

7、调试core dump文件

执行文件发生core dump后,很可能没有core文件出现,只能通过dmesg命令查看关键打印。

这种情况时由于系统限制了core文件,大小,可以用ulimit -a查看,用 ulimit -c xxx 来设置大小(如1024表示1K,设置unlimited 表示无限制),然后通过gdb test ./core可以调试test可执行文件的core。 

root@ubuntu# ulimit -a
core file size          (blocks, -c) 1024
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 7820

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值