linux下的gdb调试

gdb安装

执行下列命令,如果没安装,则进行安装;如果安装过,则进行更新
1、Centos下:

sudo yum -y install gdb

2、ubuntu下:

sudo apt-get install gdb

gdb调试

用gcc编译源程序的时候,如果不加-g参数,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。
例如:

(gcc -g -c hello.c
gcc hello.o -o hello)
||
gcc -g xxx.c -o xxx
gdb xxx

基本调试命令

命令命令缩写命令说明
breakb设置断点,可以设置多个断点
b 20:表示在第20行设置断点
b 函数名:表示将断点打在函数名处
b *addr:使断点停到address地址处
b file:linenum:断点设在file文件的linenum行处
b file:func:断点设在file文件的func处
条件断点b n if value==10:如果value=10就在n处设置断点
infoinfo b:查看设置了哪些断点
disabledisable n:将第n个断点设置为无效
enableenable n:将第n个断点设为有效
deletedelete n:删除断点n
---
runr开始运行程序, 程序运行到断点的位置会停下来
如果没有遇到断点,程序一直运行下去
nextn单步到程序源代码下一行
如果该语句为函数调用,不会进入函数内部执行
nextini单步到下一条机器指令,不进入函数
steps单步到下一源代码,如果是函数则进入函数
stepisi单步到下一条机器指令,如果是函数则进入函数
finishfinish完成当前调用函数的执行
如果出不去看一下是否设置了断点
untilu如果在循环体内单步跟踪时,until可以使程序运行到退出循环体
continuec继续程序的运行,直到遇到下一个断点
---
printp显示变量值
p name:显示变量name的值
p $rax:打印寄存器rax的值
ptypeptype 变量:显示变量的类型
displaydisplay 变量:单步跟踪的时候这些变量会自动显示出来
undisplayundisplay num:不自动显示编号为num的变量
delete display num删除自动显示的变量
---
quitq退出gdb环境
stopstop停止当前的gdb调试,但不会退出
---
disassembledisasdisas 函数名 显示当前函数的汇编代码
examinex查看内存地址中的值
格式:x/<n/f/u> addr
layout asm动态的显示汇编代码的执行情况
---
set var name=value设置变量的值
假设程序有两个变量:int ii; char name[21];
set var ii=10:ii的值设置为10;
set var name=“xiaoming”:把name的值设置为"xiaoming"
set args设置主程序的参数
例如:./xxx a b
(gdb) set args a b
p argc p argv[0] p argv[1]打印
listllist linenum:打印第linenum行上下文内容
list function:显示函数名为function的函数的源程序
list file:linenum:显示file文件下的第linenum行

如果参数里面包括特殊字符,则需要将参数用双引号 “” 括起来
在gdb调试下,可以使用 shell 命令, shell command

x n/f/u addr
n: 是正整数,表示需要显示的内存单元的个数,即从当前地址向后显示n个内存单元的内容
f: 表示addr指向的内存内容的输出格式

s对应输出字符串
x 按十六进制格式显示变量
d 按十进制格式显示变量
o 按八进制格式显示变量
f按浮点数格式显示变量

u: 以多少个字节作为一个内存单元,默认为4。当然u还可以用被一些字符表示,如b = 1 byte,h = 2 bytes,w = 4 bytes,g = 8 bytes

segment fault(段错误)

操作非法地址之后,系统会生成 core 文件
segment fault产生的原因:

  1. 坏指针错误:在指针赋值之前就用它来引用内存
  2. 改写错误:越过数组边界写入数据,在动态分配的内存空间以外写入数据,或改写一些堆管理数据结构
  3. 指针释放引起的错误:释放同一块内存两次,或释放一块未曾使用 malloc 分类的内存,或释放一个无效的指针

程序挂掉的时,系统缺省不会生成 core 文件

  1. gcc -g xxx.c
  2. ./a.out
    在这里插入图片描述
  3. ulimit -a 查看系统参数;
    在这里插入图片描述
  4. ulimit -c unlimit 把 core 文件的大小设为无限制;
    在这里插入图片描述
  5. 运行程序,生成 core 文件;
    在这里插入图片描述
  6. gdb 程序名 core文件名
    在这里插入图片描述
  7. 输入 bt,可查看函数调用栈
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值