前言
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