前言
gdb是Linux环境下的代码调试工具,为了能在linux环境下更有好的编程体验。其安装可谓是势在必行。
安装过程
安装gdb的过程很简单,具体步骤如下:
查看当前gdb安装情况
rpm -qa|grep gdb

if(有)(删除)
rpm -e --nodeps 文件名
if(没有)
首先(下载gdb源码包),直接在Linux中输入
wget http://ftp.gnu.org/gnu/gdb/gdb-7.10.1.tar.gz

解压
tar -zxf gdb-7.10.1.tar.gz

进入gdb目录
cd gdb-7.10.1
用以下命令生成makefile文件
1、输入命令
./configure

2、编译(时间比较长)
make

3、在输入一个命令
make install

这个时候我出错了,但是不要怕,输入这个命令
yum install texinfo
make install
Ubuntu版本是sudo apt-get install texinfo
查看https://blog.csdn.net/summy_j/article/details/72846076
最后判断是否成功
gdb -v
请添加图片描述

以上原文链接:https://blog.csdn.net/hannah___/article/details/90720172
举个简单例子:
请添加图片描述

#include<stdio.h>
int main(void){
        int arr[4]={1,2,3,4};
        int i=0;
        for(i=0;i<4;i++){
                printf("%d\n",arr[i]);
        }
} 

要用gcc进行编译,具体的命令如下:

gcc -g 源文件.c -o 输出的目标文件

进入jdb
请添加图片描述
r是运行 quit 是退出
请添加图片描述
请添加图片描述
gdb test
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
第二个列子

#include<stdio.h>
void hello(){
        printf("hello echo~");
}       

int main(){
        
        int arr[4] = {1,2,3,4};
        int i = 0;
        for(i=0;i<4;i++){
                printf("%d\n",arr[i]);
        }       
        hello();
        return 0;
}

请添加图片描述
请添加图片描述
请添加图片描述
补充
请添加图片描述
请添加图片描述
请添加图片描述
视频https://www.bilibili.com/video/BV1EK411g7Li?p=6&spm_id_from=pageDriver
3.GDB常用的调试命令
一大波命令来袭,hold,或者jump
(gdb)run:重新开始运行文件(run-text:加载文本文件,run-bin:加载二进制文件),简写r
(gdb) list n1 n2这样,list可以简写为l,将会显示n1行和n2行之间的代码,如果使用-tui启动gdb,将会在相应的位置显示。如果没有n1和n2参数,那么就会默认显示当前行和之后的10行,再执行又下滚10行。另外,list还可以接函数名。
执行下一步:
(gdb) next这样,执行一行代码,如果是函数也会跳过函数。这个命令可以简化为n.
执行N次下一步:
(gdb) next N
执行上次执行的命令:
(gdb) [Enter]
这里,直接输入回车就会执行上次的命令了。
单步进入:
(gdb) step
这样,也会执行一行代码,不过如果遇到函数的话就会进入函数的内部,再一行一行的执行。
(gdb)break num:在第num行设置断点,简写b
(gdb)info:查看函数内部局部变量的数值,简写i
(gdb)quit:退出gdb,简写q
(gdb)print:打印值及地址,简写p
(gdb)step:单步调试(逐语句:跳入自定义函数内部执行),简写s
指定程序直到退出当前循环体:
(gdb) until(gdb) u这里,发现需要把光标停止在循环的头部,然后输入u这样就自动执行全部的循环了。
跳转执行程序到第5行:(gdb) jump 5这里,可以简写为"j 5"需要注意的是,跳转到第5行执行完毕之后,如果后面没有断点则继续执行,而并不是停在那里了。另外,跳转不会改变当前的堆栈内容,所以跳到别的函数中就会有奇怪的现象,因此最好跳转在一个函数内部进行,跳转的参数也可以是程序代码行的地址,函数名等等类似list。
(gdb) return强制返回当前函数,这样,将会忽略当前函数还没有执行完毕的语句,强制返回。return后面可以接一个表达式,表达式的返回值就是函数的返回值。
(gdb) info breakpoints显示当前gdb断点信息。这里,可以简写为info break.会显示当前所有的断点,断点号,断点位置等等。
(gdb) delete N删除N号断点:
(gdb) delete删除所有断点:
(gdb) clear N清除行N上面的所有断点:
(gdb) continue继续运行程序直接运行到下一个断点:这里,如果没有断点就一直运行。
(gdb) until 或(gdb) u指定程序直到退出当前循环体:这里,发现需要把光标停止在循环的头部,然后输入u这样就自动执行全部的循环了。
(gdb) break fileName:N给指定文件(fileName)的某个行(N)处设置断点,这里,给某文件中的函数设置断点是同理的。
(gdb) backtrace显示当前调用函数堆栈中的函数:命令产生一张列表,包含着从最近的过程开始的所有有效过程和调用这些过程的参数。当然,这里也会显示出当前运行到了哪里(文件,行)。
(gdb) kill终止一个正在调试的程序:这里,输入kill就会终止正在调试的程序了
(gdb)frame:切换函数的栈帧,简写f
backtrace(直译回溯)(bt)当你的程序调用了一个函数,函数的地址,函数参数,函数内的局部变量都会被压入“栈”(Stack)中。你可以用这条命令来查看当前的栈中的所有信息。人为的将程序下断停住
推荐https://blog.csdn.net/awm_kar98/article/details/82840811

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐