1. 背景
● 程序的发布方式有两种,debug模式和release模式
● Linux gcc/g++出来的二进制程序,默认是release模式
● 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项(生成debug信息)
● 介绍一下readelf -S,可以读取一个可执行程序的二进制构
● 下载命令:yum install -y gdb
● 查看gdb版本 : gdb --version
2. 介绍调试命令
gdb binFile 退出: ctrl + d 或 quit 调试命令:
● gdb 文件:进入调试环境·
● list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。
● list/l 函数名:列出某个函数的源代码。● r或run:运行程序。
● n 或 next:单条执行。
● s或step:进入函数调用,可以在函数进行逐语句的调试
● break(b) 行号:在某一行设置断点
● info break :查看断点信息。
● print(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数
● p 变量:打印变量值。p &i:查看变量的地址
● set var:修改变量的值
● continue(或c):从当前位置开始连续而非单步执行程序
● run(或r):从开始连续而非单步执行程序● delete breakpoints:删除所有断点
● d n(delete breakpoints n):删除序号为n的断点
● disable breakpoints:禁用断点
● enable breakpoints:启用断点
● info(或i) breakpoints:参看当前设置了哪些断点
● display 变量名:跟踪查看一个变量,每次停下来都显示它的值
● undisplay:取消对先前设置的那些变量的跟踪
● until X行号:跳至X行
● finish:执行到当前函数返回,然后挺下来等待命令
● breaktrace(或bt):查看各级函数调用及参数
● info(i) locals:查看当前栈帧局部变量的值
● c :下一个断点
● quit:退出gdb,历史命令会消失
3. 理解
● 和windows IDE对应例子
4.开始使用
使用环境
//makefile
mycode:mycode.c gcc -o $@ $^ -g .PHONY:clean clean: rm -f mycode//mycode.c
#include <stdio.h>
void Print3()
{
printf("hello printf1\n");
}
void Print2()
{
printf("hello printf1\n");
Print3();
}
void Print1()
{
printf("hello printf1\n");
Print2();
}
int addToTop(int top)
{
int res = 0;
int i = 1;
for(; i <= top; i++)
{
res += i;
}
Print1();
return res;
}
int main()
{
printf("debug begin\n");
int top = 100;
int sum = addToTop(top);
printf("sum: %d\n", sum);
printf("debug end\n");
return 0;
}
readelf -S
查看二进制文件代码
list 行号的使用
一般情况下以行号为中间行输出,特殊情况下如行号靠近开头或结尾。
list (l) 0 后回车
可以打印所有代码
设置断点和打印断点信息
删除段点 d + 断点编号/ d 删除所有断点
(退出调试,断点信息全部消失)
设置断点后,r+回车,运行时会在断点处停止
n(next):逐过程,把函数直接当成语句,直接运行函数
s(step):逐语句,会进入函数,不跳过代码块
显示变量
长显示变量和取消长显示
限定代码出错的上下文
until 行号:
快速运行到指定行
finish
不小心进入函数时,结束函数,返回结果,可以用于测试函数。
c(continue)
直接运行到下一个断点
disable n 和 enable n
关闭断点和开启断点