如何在Linux中使用gdb调试C程序

合集下载

GDB调试简易教程

GDB调试简易教程

GDB调试简易教程GDB(GNU调试器)是一个开源的调试工具,它用于调试C、C++和其他编程语言的程序。

它允许程序员在执行过程中观察程序的内部状态,帮助找到程序中的错误并进行修复。

下面是一个简易的GDB调试教程,以帮助你入门并学会使用它。

安装GDB首先,你需要在你的系统上安装GDB。

对于大多数Linux发行版,你可以通过在终端中运行以下命令来安装它:```sudo apt-get install gdb```编译程序在使用GDB之前,你需要编译你的程序,并在编译时使用-g选项,以便生成调试信息。

例如,对于C语言程序,你可以使用以下命令来编译:```gcc -g program.c -o program```这将生成一个可执行文件program,并在目录中生成调试信息。

启动GDB在终端中使用以下命令来启动GDB并调试你的程序:```gdb program```这将启动GDB,并且你将看到GDB的命令提示符。

设置断点断点是你在程序中指定的一个位置,当程序执行到该位置时会暂停。

你可以使用断点来观察程序在这一点的状态。

要设置断点,请在GDB的命令提示符下输入以下命令:```break line_number```line_number是你想要设置断点的源代码行号。

例如,要在程序的第10行设置断点,你可以使用以下命令:```break 10```或者你也可以使用函数名作为参数来设置断点:```break function_name```开始调试一旦设置好断点,你可以开始调试你的程序了。

要开始执行程序,请输入以下命令:```run```程序将开始运行直到第一个断点处。

此时,程序会停下来并且GDB会等待你的进一步命令。

观察变量在程序运行到断点处时,你可以使用以下命令来观察程序内部的变量值:```print variable_name```variable_name是你想要观察的变量的名称。

例如,要查看变量x的值,你可以使用以下命令:```print x```你还可以通过使用其他GDB命令来观察更多的变量信息,例如观察数组、结构体等。

利用GDB调试器调试C程序详细图解

利用GDB调试器调试C程序详细图解

利用GDB调试器调试C程序详细图解一、利用GDB调试器对C程序进行调试。

1、在Linux终端下,利用命令行将当前目录切换到/usr、并在此路径下新建文件夹gdb_src,在目录/usr/gdb_src下编辑C语言源程序GDB_test.c,具体指令如图1:图12、C语言源程序GDB_test.c内容如图2:图23、在程序编译时加入调试选项-g,表明使用GDB调试器对上述程序进行调试,命令如图3:图34、启动GDB,开始程序的调试,命令如图4:图45、使用指令“list”显示源代码,l相当于list指令,如图5:图56、在源程序中第10行设置断点,如图6:图67、在源程序中print函数处设置断点,如图7:图78、使用“info”指令显示断点信息,如图8:图89、使用“run”指令运行程序,r相当于run指令,如图8:图910、程序在第一个断点处停止,使用“next”指令单步运行程序,n相当于next 指令,如图10:图1011、再使用“next”指令单步运行程序,如图11:图1112、使用“print”指令输出变量i的值,如图12:图1213、使用“continue”指令让程序继续执行,c相当于continue,如图13:图1314、再使用“continue”指令让程序继续执行,程序运行结束,如图13:图1415、退出GDB调试器,如图15:图15二、利用GDB调试器对下列程序进行调试,找出程序错误之处,并改正、运行,在屏幕上显示出正确结果,要求将在Linux 的终端中的调试过程屏幕截图以供验收。

1、原程序指令如图1:图1参考资料:1、Linux包含一个叫GDB的GNU调试程序,GDB是一个用来调试C和C++语言程序的调试器,并能在程序运行时观察程序的内部结构和内存的使用情况,具体GDB基本命令见文档“GDB基本命令集”;2、一般来说,GDB提供如下功能:(1) 启动程序,按照程序员自定义的要求运行程序;(2) 单步执行、设置断点,以使程序在指定的断点代码上停止执行;(3) 监视程序中变量的值和其他发生的事情;(4) 动态改变程序的执行环境。

Linux命令高级技巧使用gdb命令进行程序的调试与分析

Linux命令高级技巧使用gdb命令进行程序的调试与分析

Linux命令高级技巧使用gdb命令进行程序的调试与分析在Linux环境下,gdb(GNU调试器)是一个非常强大的工具,用于调试和分析程序的运行。

它提供了丰富的功能,能够帮助开发人员定位和解决程序中的错误。

本文将介绍一些使用gdb命令进行程序调试与分析的高级技巧。

一、安装gdb命令若系统中尚未安装gdb命令,可以通过以下方式安装:1. 打开终端窗口2. 输入命令“sudo apt-get install gdb”并按下回车键3. 输入用户密码并按下回车键4. 等待安装完成二、使用gdb调试程序调试程序是开发过程中非常重要的一环。

gdb提供了各种功能,可以帮助开发人员追踪代码的执行,查找变量的值,以及定位程序中的错误。

下面介绍一些常用的调试命令:1. 启动gdb调试使用命令“gdb <可执行文件>”启动gdb调试器,其中<可执行文件>是需要调试的程序的路径和文件名。

2. 设置断点在需要设置断点的代码行前面输入“break”命令,例如“break main”,即可在main函数入口处设置断点。

使用命令“info breakpoints”可以查看已设置的断点。

3. 运行程序输入“run”命令,即可开始运行程序。

程序运行到断点处会自动停止,等待用户进行调试操作。

4. 单步执行输入“next”命令可逐行执行程序,遇到函数调用时会直接跳过,并进入下一行。

若想进入函数内部进行调试,使用“step”命令。

5. 查看变量值使用“print <变量名>”命令可以查看变量的值,例如“print num”即可查看名为num的变量的值。

6. 修改变量值输入“set <变量名>=<新值>”命令可以修改变量的值,例如“setnum=10”即可将名为num的变量的值修改为10。

7. 继续执行使用“continue”命令可以让程序继续执行,直到遇到下一个断点或程序结束。

使用GDB进行程序调试

使用GDB进行程序调试

使用GDB进行程序调试GDB(GNU Debugger)是一个功能强大的调试工具,可以帮助程序员找到和解决程序中的错误。

它支持多种编程语言,包括C,C++,Fortran 等,并且可以在多种操作系统上运行,如Linux,MacOS和Windows。

下面是使用GDB进行程序调试的一般步骤:1. 编译程序时添加调试信息:在使用GDB进行程序调试之前,我们需要在编译程序时添加调试信息。

在GCC编译器中,可以通过使用`-g`选项来实现。

例如,`gcc -g my_program.c -o my_program`。

2. 启动GDB:以调试模式启动GDB,可以通过在终端中输入`gdb`命令来启动GDB。

然后,使用`file`命令加载要调试的可执行文件。

例如,`file my_program`。

3. 设置断点:在代码中设置断点,GDB会在断点处停止执行程序。

可以使用`break`命令来设置断点。

例如,`break main`会在程序开始执行时停止在`main`函数的第一行。

4. 运行程序:使用`run`命令来运行程序。

GDB会启动程序,并在遇到断点时停止。

可以使用`continue`命令继续执行程序。

5. 调试程序:一旦程序停止在断点处,可以使用一些GDB命令来检查变量的值,跟踪程序执行流程等。

例如,使用`print`命令来打印变量的值,使用`step`命令来单步执行程序,使用`next`命令将执行一行代码,而不会深入到函数内部。

6. 回顾栈帧:GDB允许回顾程序调用栈上的栈帧信息。

可以使用`backtrace`命令来打印当前调用栈上所有活动栈帧的信息。

使用`frame`命令可以切换到任一栈帧。

7. 调试崩溃:如果程序崩溃了,GDB将会在崩溃发生时停止程序并提供一些有关崩溃原因的信息。

通过使用`bt`命令可以获得崩溃时的调用栈信息。

8. 再次运行:如果在调试过程中发现问题已经解决,可以使用`kill`命令停止程序的执行,并使用`run`命令重新运行程序。

linux C- gdb调试、Makefile

linux C- gdb调试、Makefile

linux C-gdb调试、Makefilegcc可以编译c, c++, object-c, java等众多的语言程序g++则是专注于C和C++。

gdb调试GDB 调试器是一个功能强大的工具,它可以做很多的调试工作,如断点,单步跟踪等。

相关命令:下面演示两个例子,追踪快速排序的过程和查看优化后的gcd()算法(方法来自编程之美)观察快速排序:打印数组,查看快速排序中各个元素的位置变化源码:#include <stdio.h>#include <algorithm>using namespace std;int partion(int a[],int start,int end){int i=start,j=end;int temp=a[start];while(i<j){while(i<j && a[j]>=temp) j--;a[i]=a[j]; // i are morewhile(i<j && a[i]<=temp) i++;a[j]=a[i]; // j are more}a[i]=temp; // at end , i=jreturn i;}void Qsort(int a[],int start,int end){if(start<end){int d=partion(a,start,end);Qsort(a,start,d);Qsort(a,d+1,end);}}int main(){int a[10]={3,2,7,5,1,0,9,6,4,11};Qsort(a,0,9);for(int i=0;i<10;i++)printf("%d ",a[i]);printf("\n");return 0;}指令:edemon@linux:~$ g++ -g -o exe main.cppedemon@linux:~$ gdb exe(gdb) break 17Breakpoint 1 at 0x4006f4: file main.cpp, line 17.(gdb) runBreakpoint 1, Qsort (a=0x7fffffffdda0, start=0, end=9) at main.cpp:17 17 if(start<end){(gdb) p *a@10$2 = {3, 2, 7, 5, 1, 0, 9, 6, 4, 11}(gdb) continueBreakpoint 1, Qsort (a=0x7fffffffdda0, start=0, end=3) at main.cpp:17 17 if(start<end){(gdb) p *a@10$3 = {0, 2, 1, 3, 5, 7, 9, 6, 4, 11}(gdb) continueContinuing.Breakpoint 1, Qsort (a=0x7fffffffdda0, start=0, end=0) at main.cpp:17 17 if(start<end){(gdb) p *a@10$4 = {0, 2, 1, 3, 5, 7, 9, 6, 4, 11}(gdb) continueContinuing.Breakpoint 1, Qsort (a=0x7fffffffdda0, start=1, end=3) at main.cpp:17 17 if(start<end){(gdb) p *a@10$5 = {0, 2, 1, 3, 5, 7, 9, 6, 4, 11}(gdb) continueContinuing.Breakpoint 1, Qsort (a=0x7fffffffdda0, start=1, end=2) at main.cpp:17 17 if(start<end){(gdb) p *a@10$6 = {0, 1, 2, 3, 5, 7, 9, 6, 4, 11}(gdb) continueContinuing.Breakpoint 1, Qsort (a=0x7fffffffdda0, start=1, end=1) at main.cpp:17 17 if(start<end){(gdb) p *a@10$7 = {0, 1, 2, 3, 5, 7, 9, 6, 4, 11}(gdb) continueContinuing.Breakpoint 1, Qsort (a=0x7fffffffdda0, start=2, end=2) at main.cpp:17 17 if(start<end){(gdb) p *a@10$8 = {0, 1, 2, 3, 5, 7, 9, 6, 4, 11}(gdb) continueContinuing.Breakpoint 1, Qsort (a=0x7fffffffdda0, start=3, end=3) at main.cpp:17 17 if(start<end){(gdb) p *a@10$9 = {0, 1, 2, 3, 5, 7, 9, 6, 4, 11}(gdb) continueContinuing.Breakpoint 1, Qsort (a=0x7fffffffdda0, start=4, end=9) at main.cpp:17 17 if(start<end){(gdb) p *a@10$10 = {0, 1, 2, 3, 5, 7, 9, 6, 4, 11}(gdb) continueContinuing.Breakpoint 1, Qsort (a=0x7fffffffdda0, start=4, end=5) at main.cpp:17 17 if(start<end){(gdb) p *a@10$11 = {0, 1, 2, 3, 4, 5, 9, 6, 7, 11}(gdb) continueContinuing.Breakpoint 1, Qsort (a=0x7fffffffdda0, start=4, end=4) at main.cpp:17 17 if(start<end){(gdb) p *a@10$12 = {0, 1, 2, 3, 4, 5, 9, 6, 7, 11}(gdb) continueContinuing.Breakpoint 1, Qsort (a=0x7fffffffdda0, start=5, end=5) at main.cpp:17 17 if(start<end){(gdb) p *a@10$13 = {0, 1, 2, 3, 4, 5, 9, 6, 7, 11}(gdb) continueContinuing.Breakpoint 1, Qsort (a=0x7fffffffdda0, start=6, end=9) at main.cpp:17 17 if(start<end){(gdb) p *a@10$14 = {0, 1, 2, 3, 4, 5, 9, 6, 7, 11}(gdb) continueContinuing.Breakpoint 1, Qsort (a=0x7fffffffdda0, start=6, end=8) at main.cpp:17 17 if(start<end){(gdb) p *a@10$15 = {0, 1, 2, 3, 4, 5, 7, 6, 9, 11}(gdb) continueContinuing.Breakpoint 1, Qsort (a=0x7fffffffdda0, start=6, end=7) at main.cpp:17 17 if(start<end){(gdb) p *a@10$16 = {0, 1, 2, 3, 4, 5, 6, 7, 9, 11}(gdb) continueContinuing.Breakpoint 1, Qsort (a=0x7fffffffdda0, start=6, end=6) at main.cpp:17 17 if(start<end){(gdb) p *a@10$17 = {0, 1, 2, 3, 4, 5, 6, 7, 9, 11}(gdb) continueContinuing.Breakpoint 1, Qsort (a=0x7fffffffdda0, start=7, end=7) at main.cpp:17 17 if(start<end){(gdb) p *a@10$18 = {0, 1, 2, 3, 4, 5, 6, 7, 9, 11}(gdb) continueContinuing.Breakpoint 1, Qsort (a=0x7fffffffdda0, start=8, end=8) at main.cpp:17 17 if(start<end){(gdb) p *a@10$19 = {0, 1, 2, 3, 4, 5, 6, 7, 9, 11}(gdb) continueContinuing.Breakpoint 1, Qsort (a=0x7fffffffdda0, start=9, end=9) at main.cpp:17 17 if(start<end){(gdb) p *a@10$20 = {0, 1, 2, 3, 4, 5, 6, 7, 9, 11}(gdb) continueContinuing.0 1 2 3 4 5 6 7 9 11[Inferior 1 (process 7467) exited normally]计算24, 26的最大公约数:使用gdb查看递归情况,a和b是怎样变化的。

linux下C语言使用编译与调试试验

linux下C语言使用编译与调试试验
u
撤消
·
重做
2、GNU C编译器
1)使用gcc
通常后跟一些选项和文件名来使用gcc编译器。gcc命令的基本用法如下:
gcc [options] []
命令行选项指定的编译过程中的具体操作
2) gcc常用选项
当不用任何选项编译一个程序时,gcc将建立(假定编译成功)一个名为a.out的可执行文件。
选项含义:
{ห้องสมุดไป่ตู้
printf("Usage:pow base exponent\n");
exit(1);
}
res = mypow(x, y);
printf("%u ^ %u = %u\n", x, y, res);
return 0;
}
编译过程:
# gcc -c mypow.c
# ar rcsv libpow.a mypow.o
此时得到的可执行文件就不再是a.out,而是count。
-c GCC仅把源代码编译为目标代码。默认时GCC建立的目标代码文件有一个.o的
扩展名。
-E对文件进行预处理
-S对文件进行编译,生成汇编代码。
-O对源代码进行基本优化。这些优化在大多数情况下都会使程序执行得更快。
-g在可执行程序中包含标准调试信息。
-Wall允许发出GCC能提供的所有有用的警告,也可以用-W(warning)来标识指定的
警告。
-lname链接静态库
-Ldir库文件的搜索路径
3)执行文件
格式:./可执行文件名
例:
# ./a.out
# ./count
4)例子
mypow.c:定义mypow()函数

如何在Linux终端中调试程序

如何在Linux终端中调试程序在Linux系统中,终端是开发者和系统管理员经常使用的重要工具。

通过终端,我们可以执行各种命令和操作,包括程序的编译、运行和调试。

本文将介绍在Linux终端中如何进行程序调试的方法和技巧。

一、安装调试工具要在Linux终端中进行程序调试,首先需要安装相应的调试工具。

常用的调试工具包括GDB (GNU调试器)和LLDB (LLVM调试器)。

这两个工具都是开源的,可以通过包管理器来安装。

1. 使用GDB进行程序调试GDB是Linux中最常用的调试工具之一。

下面是GDB的安装方法:```$ sudo apt-get install gdb```安装完成后,可以通过以下命令来验证安装是否成功:```$ gdb --version```2. 使用LLDB进行程序调试LLDB是一个高级的调试工具,它可以用于多种编程语言,包括C、C++和Objective-C。

下面是LLDB的安装方法:```$ sudo apt-get install lldb```安装完成后,可以通过以下命令来验证安装是否成功:```$ lldb --version```二、编译程序时的调试选项在Linux终端中调试程序时,为了方便跟踪问题和定位错误,可以在编译程序时添加调试选项。

常用的调试选项包括-g(生成调试信息)、-Wall(显示警告信息)和-O0(禁用优化)。

例如,使用gcc编译C程序时可以使用以下命令:```$ gcc -g -Wall -O0 program.c -o program```三、使用GDB进行程序调试1. 启动GDB调试器通过以下命令启动GDB调试器,并加载需要调试的程序:```$ gdb program```2. 设置断点在GDB中,可以使用break命令设置断点,以便在程序执行到指定位置时暂停。

例如,要在函数的第10行设置断点,可以使用以下命令:```(gdb) break 10```3. 执行程序使用run命令执行程序,并在断点处停止:```(gdb) run```4. 调试程序一旦程序在断点处停止,可以使用以下命令进行调试:- 继续执行:使用continue命令继续执行程序。

使用GDB命令行调试器调试C-C++程序

使用GDB命令行调试器调试C/C++程序
没有调试器的情况下编写程序时最糟糕的状况是什么?编译时跪着祈祷不要出错?用血祭召唤恶魔帮你运行程序?或者在每一行代码间添加printf("test")语句来定位错误点?如你所知,编写程序时不使用调试器的话是不方便的。

幸好,linux下调试还是很方便的。

大多数人使用的IDE都集成了调试器,但linux 最著名的调试器是命令行形式的C/C++调试器GDB。

然而,与其他命令行工具一致,DGB需要一定的练习才能完全掌握。

这里,我会告诉你GDB的基本情况及使用方法。

安装GDB
大多数的发行版仓库中都有GDB
Debian 或Ubuntu
$ sudo apt-get install gdb
Arch Linux
$ sudo pacman -S gdb
Fedora,CentOS 或RHEL:
$sudo yum install gdb
如果在仓库中找不到的话,可以从官网中下载。

示例代码
当学习GDB时,最好有一份代码,动手试验。

下列代码是我编写的简单例子,它可以很好的体现GDB的特性。

将它拷贝下来并且进行实验——这是最好的方法。

#include
#include
int main(int argc,char**argv)
{
int i;
int a=0, b=0, c=0;
double d;。

linux下的C语言开发(gdb调试)

linux下的C语言开发(gdb调试)【声明:版权所有,欢迎转载,请勿用于商业用途。

联系信箱:feixiaoxing @】编写代码过程中少不了调试。

在windows下面,我们有visual studio工具。

在linux下面呢,实际上除了gdb 工具之外,你没有别的选择。

那么,怎么用gdb进行调试呢?我们可以一步一步来试试看。

既然需要调试,那么生成的可执行文件就需要包含调试的信息,这里应该怎么做呢?很简单,输入gcc test.c -g -o test。

输入命令之后,如果没有编译和链接方面的错误,你就可以看到可执行文件test了。

调试的步骤基本如下所示,(01)首先,输入gdb test(02)进入到gdb的调试界面之后,输入list,即可看到test.c源文件(03)设置断点,输入b main(04)启动test程序,输入run(05)程序在main开始的地方设置了断点,所以程序在printf处断住(06)这时候,可以单步跟踪。

s单步可以进入到函数,而n单步则越过函数(07)如果希望从断点处继续运行程序,输入c(08)希望程序运行到函数结束,输入finish(09)查看断点信息,输入info break(10)如果希望查看堆栈信息,输入bt(11)希望查看内存,输入x/64xh + 内存地址(12)删除断点,则输入delete break + 断点序号(13)希望查看函数局部变量的数值,可以输入print + 变量名(14)希望修改内存值,直接输入print + *地址= 数值(15)希望实时打印变量的数值,可以输入display + 变量名(16)查看函数的汇编代码,输入disassemble + 函数名(17)退出调试输入quit即可。

Linux命令高级技巧使用gdb和valgrind进行内存调试和分析

Linux命令高级技巧使用gdb和valgrind进行内存调试和分析在Linux系统中,gdb和valgrind是两个常用的工具,用于进行程序的内存调试和分析。

本文将介绍如何使用gdb和valgrind进行高级技巧的相关操作和使用方法。

一、gdb内存调试技巧1. 编译程序时加入调试信息在进行程序编译时,可以添加-g参数,以便在调试时获取符号表信息。

例如:```gcc -g myprogram.c -o myprogram```2. 启动gdb调试程序在终端中输入下列命令启动gdb,并加载待调试的程序:```gdb myprogram```3. 设置断点使用break命令设置断点,指定程序执行到特定位置时停下来。

例如,在第10行设置断点:```break 10```4. 运行程序输入run命令以运行程序。

程序将会在设置的断点处停下来。

可以通过step或next命令逐行执行程序。

5. 输出变量值在断点停下来时,可以使用print命令打印出变量的值。

例如:```print variable```6. 监测内存错误使用GNU debugger的功能来检查内存错误和泄漏。

使用valgrind 可以检测到许多内存相关的问题。

二、valgrind内存分析技巧1. 安装valgrind在Linux系统中,可以使用包管理工具安装valgrind。

例如,在Ubuntu系统中,可以使用以下命令安装valgrind:```sudo apt-get install valgrind```2. 运行valgrind在终端中输入以下命令来运行valgrind:```valgrind --tool=memcheck ./myprogram```其中,myprogram为待分析的程序。

3. 查找内存错误valgrind将会分析程序的内存使用情况,并输出相关的错误信息。

特别是当程序存在内存泄漏时,valgrind将会给出相应的提示。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

如何在Linux中使用gdb调试C程序
无论多么有经验的程序员,开发的任何软件都不可能完全没有bug。

因此,排查及修复bug 成为软件开发周期中最重要的任务之一。

有许多办法可以排查bug(测试、代码自审等等),但是还有一些专用软件(称为调试器)可以帮助准确定位问题的所在,以便进行修复。

如果你是C/C++ 程序员,或者使用Fortran 和Modula-2 编程语言开发软件,那么你将会很乐意知道有这么一款优秀的调试器- GDB - 可以帮你更轻松地调试代码bug 以及其它问题。

在这篇文章中,我们将讨论一下GDB 调试器的基础知识,包括它提供的一些有用的功能/选项。

在我们开始之前,值得一提的是,文章中的所有说明和示例都已经在Ubuntu 14.04 LTS 中测试过。

教程中的示例代码都是 C 语言写的;使用的shell 为bash(4.3.11);GDB 版本为7.7.1。

GDB 调试器基础
通俗的讲,GDB 可以让你看到程序在执行过程时的内部流程,并帮你明确问题的所在。

我们将在下一节通过一个有效的示例来讨论GDB 调试器的用法,但在此之前,我们先来探讨一些之后对你有帮助的基本要点。

首先,为了能够顺利使用类似GDB 这样的调试器,你必须以指定的方式编译程序,让编译器产生调试器所需的调试信息。

例如,在使用gcc 编译器(我们将在本教程之后的章节用它来编译C 程序示例)编译代码的时候,你需要使用 -g 命令行选项。

IT网,http://it 想要了解gcc 编译器手册页中关于 -g 命令行选项相关的内容,请看这里。

下一步,确保在你的系统中已经安装GDB 调试器。

如果没有安装,而且你使用的是基于Debian 的系统(如Ubuntu),那么你就可以使用以下命令轻松安装该工具:
sudo apt-get install gdb
在其他发行版上的安装方法,请看这里。

现在,当你按照上述的方式编译完程序(gcc -g 命令行选项),同时也已经安装好GDB 调。

相关文档
最新文档