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
基本调试命令
| 命令 | 命令缩写 | 命令说明 |
|---|---|---|
| break | b | 设置断点,可以设置多个断点 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处设置断点 | |
| info | info b:查看设置了哪些断点 | |
| disable | disable n:将第n个断点设置为无效 | |
| enable | enable n:将第n个断点设为有效 | |
| delete | delete n:删除断点n | |
| - | - | - |
| run | r | 开始运行程序, 程序运行到断点的位置会停下来 如果没有遇到断点,程序一直运行下去 |
| next | n | 单步到程序源代码下一行 如果该语句为函数调用,不会进入函数内部执行 |
| nexti | ni | 单步到下一条机器指令,不进入函数 |
| step | s | 单步到下一源代码,如果是函数则进入函数 |
| stepi | si | 单步到下一条机器指令,如果是函数则进入函数 |
| finish | finish | 完成当前调用函数的执行 如果出不去看一下是否设置了断点 |
| until | u | 如果在循环体内单步跟踪时,until可以使程序运行到退出循环体 |
| continue | c | 继续程序的运行,直到遇到下一个断点 |
| - | - | - |
| p | 显示变量值 p name:显示变量name的值 p $rax:打印寄存器rax的值 | |
| ptype | ptype 变量:显示变量的类型 | |
| display | display 变量:单步跟踪的时候这些变量会自动显示出来 | |
| undisplay | undisplay num:不自动显示编号为num的变量 | |
| delete display num | 删除自动显示的变量 | |
| - | - | - |
| quit | q | 退出gdb环境 |
| stop | stop | 停止当前的gdb调试,但不会退出 |
| - | - | - |
| disassemble | disas | disas 函数名 显示当前函数的汇编代码 |
| examine | x | 查看内存地址中的值 格式: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]打印 | |
| list | l | list 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产生的原因:
- 坏指针错误:在指针赋值之前就用它来引用内存
- 改写错误:越过数组边界写入数据,在动态分配的内存空间以外写入数据,或改写一些堆管理数据结构
- 指针释放引起的错误:释放同一块内存两次,或释放一块未曾使用 malloc 分类的内存,或释放一个无效的指针
程序挂掉的时,系统缺省不会生成 core 文件
- gcc -g xxx.c
- ./a.out

- ulimit -a 查看系统参数;

- ulimit -c unlimit 把 core 文件的大小设为无限制;

- 运行程序,生成 core 文件;

- gdb 程序名 core文件名

- 输入 bt,可查看函数调用栈


6948

被折叠的 条评论
为什么被折叠?



