gdb调试工具
1.gdb命令
gdb是一个Linux下的代码调试工具,通常与gcc/g++配合使用。
下面列举gdb的常用命令
list/l //显示对应行号或函数前后5行的内容
操作:l [文件名] :[行号]
l [函数名]
r/run //运行程序
start //开始进行逐步调试
n/next //逐步单条执行(一步代表下一行逻辑)
s/step //逐函数执行(一步代表一个函数执行)
b/break //打断点
操作:b [文件名] : [行号]
b [函数名]
b [变量名]
info break//查看断点信息
delete breakpoints [序号] 删除断点
breaktrace 查看栈调用情况
untail [行号]//跳至对应行
p [变量名] //打印变量名
continue/c //从当前位置开始继续执行
q //退出
2.调试实例
先看一段代码
//举一个简单案例来熟悉一下gdb指令
#include<stdio.h>
#include<string.h>
void fun()
{
char* ptr = "hello";
strcpy(ptr,"world");
printf("ptr:%s",ptr);
}
int main()
{
printf("hello world/n");
fun();
return 0;
}
运行出现段错误,然后进行调试
//然后在终端输入
gdb ./t
然后出现了以下问题‘
显示没有找到对应debug版本,这个原因是由于gcc的运行默认是release版本的,所以
重新进行编译debug版本
gcc -g test.c -o t
再次输入gdb ./t后
首先run进行运行程序
显示出现错误,此时输入start开始进行逐步调试
此时显示程序停在了11行,现在查看一下11行的内容,输入list 命令
此时开始逐步检查,分别输入step、next指令发现程序在strcpy时出现错误
其实很明显是strcpy出现错误,但是为了学习指令就假装暂时没有发现它吧~~~战术狗头
输入until命令,跳至刚刚检查的错误行(在学习中发现until似乎不能跨函数?)
然后打断点进行调试,顺便查看断点信息,下次run运行程序就会停在断点处
然后发现错误后进行修改,strcpy时ptr指向的是常量区,const常量不能进行修改。
此时为ptr开辟数组空间即可
#include<stdio.h>
#include<string.h>
void fun()
{
char ptr[] = "hello\n";
strcpy(ptr,"world");
printf("ptr:%s\n",ptr);
}
int main()
{
printf("hello world\n");
fun();
return 0;
}