Linux基础开发工具gdb
1、Debug和release
程序的发布方式有两种,Debug和release模式,Debug模式是开发者模式,用户最终用的是release,在Debug模式下,因为增加了调试信息,所以可执行文件体积较大,gcc/g++ 默认编译出来的程序是Release 版本,如果想在Debug模式下得到可执行程序,那么需要输入:
cpp
gcc mycmd.c -o mycmd -g

通过readelf mycmd-debug -S | grep debug 指令,可以将二进制文件中与Debug有关的部分过滤出来,打印出mycmd-debug在Debug模式下的信息
2、gdb常用指令
mycmd.c:
cpp
#include <stdio.h>
int Sum(int s, int e)
{
int result = 0;
int i = s;
for(s; i <= e; i++)
{
result += i;
}
return result;
}
int main()
{
int start = 1;
int end = 100;
printf("I will begin\n");
int n = Sum(start, end);
printf("running done, result is: [%d~%d]=%d\n", start, end, n);
return 0;
}
输入gdb,进入gdb环境

输入q退出
- 输入
list或l:显示源代码

- 输入
l num或list num:查看文件第num行附近代码

- 输入
run或r:运行程序

打断点时,使用gdb不方便查看断点,以下使用cgdb进行调试
- 输入
b 行号:设置断点 - 输入
info b 行号:查看所有断点信息

- 输入
d num:删除断点

n或next:逐过程单步执行面部进入函数内部

s或step:逐语句单步执行,进入函数内部
断点为第18行:


- 输入
p 变量:打印变量或表达式的值

p为单次打印,单步执行,不会自动刷新,打印变量的值不会变化
display 变量名:跟踪监视,程序每次暂停,自动打印变量undisplay num:取消对先前变量的跟踪

- 输入
until x:跳转至x行

- 输入
finish:执行到当前函数结束,暂停在函数调用处,打印返回值

$1 是 gdb 保存返回值的变量,5050 就是 Sum 函数 return 带回的结果
- 输入
continue或c:从当前断点直接运行到下一个断点

disable breakpoints:禁用断点enable breakpoints:启用被禁用的断点backtrace或bt:查看函数调用栈info locals:查看当前函数局部变量set var:修改变量的值