Linux应用的调试GDB使用方法GDB常用命令
- 格式:ppt
- 大小:264.00 KB
- 文档页数:23
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”命令可以让程序继续执行,直到遇到下一个断点或程序结束。
Linux下GNU调试器gdb详细说明1.简介Linux下GNU 的调试器称为 gdb,该程序是一个交互式工具,工作在字符模式。
在 X Window 系统中,有一个 gdb 的前端图形工具,称为 xxgdb。
gdb 是功能强大的调试程序,可完成如下的调试任务:* 设置断点;* 监视程序变量的值;* 程序的单步执行;* 修改变量的值。
在可以使用gdb 调试程序之前,必须使用-g 选项编译源文件。
可在 makefile 中如下定义CFLAGS 变量:CFLAGS = -g运行 gdb 调试程序时通常使用如下的命令:gdb progname在 gdb 提示符处键入help,将列出命令的分类,主要的分类有:* aliases:命令别名* breakpoints:断点定义;* data:数据查看;* files:指定并查看文件;* internals:维护命令;* running:程序执行;* stack:调用栈查看;* statu:状态查看;* tracepoints:跟踪程序执行。
键入 help 后跟命令的分类名,可获得该类命令的详细清单。
2.gdb 的常用命令表 1-4 常用的 gdb 命令命令解释break NUM 在指定的行上设置断点。
bt 显示所有的调用栈帧。
该命令可用来显示函数的调用顺序。
clear 删除设置在特定源文件、特定行上的断点。
其用法为:clear FILENAME:NUM。
continue 继续执行正在调试的程序。
该命令用在程序由于处理信号或断点而导致停止运行时。
display EXPR 每次程序停止后显示表达式的值。
表达式由程序定义的变量组成。
file FILE 装载指定的可执行文件进行调试。
help NAME 显示指定命令的帮助信息。
info break 显示当前断点清单,包括到达断点处的次数等。
info files 显示被调试文件的详细信息。
info func 显示所有的函数名称。
常用gdb命令列表命令标志命令命令描述file prog 载入prog可执行文件,为调试做准备kill 终止正在调试的进程list 显示正在调试程序的部分源代码next 从当前执行代码出,执行下一行代码(如果当前行是函数调用,该命令不会进入函数)step 跟踪到函数内容执行一行代码(如果当前行是函数调用,gdb会进入该函数运行;不过该函数必须包含调试信息)run 从头执行当前被调试的程序continue 持续执行到下一个断点quit退出gdb调试环境watch 监视一个变量的值,每单步执行一步,gdb都会显示该变量的当前值break ARGS tbreak ARGS hbreak ARGS thbreak ARGS rbreak REGEXP 设置断点(break),当程序执行到断点时将被挂起。
tbreak为临时断点,一次有效,断点完毕将被删除。
hbreak为硬件中断断点。
thbreak为硬件临时断点。
rbreak为正则表达式断点,匹配该表达式的所有函数将被中断break main 在main函数入口设置断点break SampleChildClass::PrintMe在类的成员函数断点break foo(int) 对于不同的重载函数设置断点break foo(int,int)break :foo(int)对源文件某个函数或者某一行设置断点使用info breaks查看断点,使用enable/disable<Breakpoint Number>启用和禁用断点。
删除断点使用delete breakpoints<Breakpoint Number>util lineno 运行到lineno一行finish 运行到函数返回make 不退出gdb,对项目重新编译链接shell 不退出gdb,执行shell命令print 打印当前变量的值backtrace或bt 显示所有的调用栈帧,该命令可用来显示函数的调用顺序info break 显示当前断点清单,包括到达断点处的次数等info files 显示被调试文件的详细信息info func 显示所有的函数名称info local 显示当前函数中的局部变量信息info prog 显示被调试工具的执行状态info var 显示所有的全局和静态变量名称gdb程序的调试过程如下:1、生成调试文件为了生成调试信息,用户无论使用gcc,g++或者cc编译器都必须在编译时使用-g参数,这样在调试的时候才能看到对应的源程序代码。
GDB常用指令——linux 操作系统实验在做操作系统实验时,需要运用GDB进行调试程序,现将一些常用的指令汇总如下。
点停止下来后,就执行命令,命令要以end结束,例如:显示rip之后的5条指令汇编指令,例如再用gdb分析C程序的函数调用时,需要了解C程序传输传递的一些约定规则。
参数传递,当被调用函数的参数小于或者等于6个时,参数传递只使用寄存器,不使用栈来传递参数,当被调用函数参数大于6个时,多于6个的参数将使用栈来传递。
其中第一至第六个参数对应的寄存器是%rdi,%rsi,%rdx,%rcx,%r8,%r9。
另外这6个寄存器的宽度会根据参数类型来改变,例如如果参数1是64 bits,就对应%rdi,如果是32 bits就对应%edi,16 bits 对应%di,8 bits 对应%dil。
此外%r8和%r9,是x64 CPU所特有的,以%r8为例,32bits 对应%r8d,16bits 对应%r8w,8bits 对应%r8b。
函数过程中寄存器修改规则,寄存器%rbx、%rbp、%r12、%r13、%r14、和%r15是被调用者保存寄存器,当过程P调用过程Q时,Q必须保持这些寄存器的值,也就是在Q开始运行到Q返回这个,过程中,这些值保持不变,换句话说,就是P调用完Q后,这些寄存器的值就是P 放在里面的值,在Q运行的过程中,如果要使用这些寄存器,就必须要先保存这些寄存器的原值,在Q返回之前,要将原值返回到寄存器中。
除去%rsp寄存器之外的所有其他寄存器是调用者保存寄存器,所有被调用者都可以修改这些寄存器的值,在之前,不用加以保护,也就是说,P在调用Q之前,由于Q可以随意的修改这些寄存器值,如果P需要在调用完Q后,需要继续寄存器中的当前值,那么P就需要在调用Q之前,将这些值加以保护——放入栈中。
在从Q返回后,再将这些值返回到寄存器中。
此外再用栈来传递参数时,参数从右向左逐个入栈的。
Linux应⽤调试使⽤gdb和gdbserver命令详解1.gdb和gdbserver调试原理通过linux虚拟机⾥的gdb,来向开发板⾥的gdbserver发送命令,⽐如设置断点,运⾏setp等,然后开发板上的gdbserver收到命令后,便会执⾏应⽤程序做相应的动作,来实现调试的功能和之前学的裸板GDB调试⼀样,只不过之前学的是在win下的,本次是在linux⾥的gdb1.1同样,它们都会需要⼀个带调试信息的编译⽂件.通过Makefile⾥的arm-linux-gcc -g 来的, -g:表⽰编译⽂件⾥包含gdb调试信息1.2为什么需要调试信息的编译⽂件?⽐如读开发板的应⽤程序⾥的变量a:⾸先gdb通过应⽤程序的带调试信息的编译⽂件,来找出变量a存的地址位置然后将地址发送给开发板⾥的gdbserver,来读出a地址的值2.安装gdb和gdbserver2.1在虚拟机上安装GDB: # tar xjf gdb-7.4.tar.bz2 //解压# cd gdb-7.4/ //进⼊gdb-7.4⽬录#./configure --target=arm-linux//GDB需要在pc本机⾥运⾏,并调试开发板⾥的应⽤程序,所以--target设为arm-linux#make //编译#mkdir tmp#make install prefix=$PWD/tmp //安装到./tmp⽬录下sudo cp tmp/bin/arm-linux-gdb /bin/ //复制到/bin⽬录下/bin/arm-linux-gdb -v //-v: 确定⼀下gdb的版本VID,是否是7.42.2 在开发板上安装GDBServer:cd gdb/gdbserver/ //在gdb-7.4⽬录下输⼊./configure --target=arm-linux --host=arm-linux //设GDBServer的⼯作环境make //编译出现以下错误:指在linux-arm-low.c⾥,没有找到PTRACE_GETSIGINFO 定义2.3 解决:1)#echo $PATH //来查看PATH环境变量找到编译器gcc位于/work/tools/gcc-3.4.5-glibc-2.3.6/bin2)#cd /work/tools/gcc-3.4.5-glibc-2.3.6/ # grep "PTRACE_GETSIGINFO" * -nR在gcc根⽬录下,搜索到在linux/ptrace.h中定义:3)#vi linux-arm-low.c添加: #define PTRACE_GETSIGINFO 0x42024)最后重新make,⽣成gdbserver命令⽂件然后将gdbserver命令⽂件,放⼊我们开发板的根⽬录/bin中,便能使⽤了cp gdbserver /nfs_root/bin/ //nfs_root:开发板的nfs系统根⽬录3.测试程序如下(test_debug.c)#include <stdio.h>void C(int *p){ *p = 0x12;}void B(int *p){ C(p);}void A(int *p){ B(p);}void A2(int *p){ C(p);}int main(int argc, char **argv){ int a; int *p = NULL; A2(&a); // A2 > C printf("a = 0x%x\n", a); A(p); // A > B > C return 0;}其中A2(&a)会调⽤A2()->C(),然后将a赋值为0x12.A(p)会调⽤A()->B()->C(),由于p是个空指针,这⾥将会出错.接下来,我们便以这个应⽤程序为例.4.编译#arm-linux-gcc -g -o test_debug test_debug.c //-g:附带调试信息5.调试test_debug.c在开发板上:⾸先,需要让gdbserver建⽴本地服务器,以及要测试的哪个⽂件:#gdbserver 192.168.2.107:2345 ./test_debug//192.168.2.107:本地IP地址//2345:端⼝号,⽤来让gdb来连接⽤的//./test_debug:要测试的哪个⽂件在虚拟机上:#/bin/arm-linux-gdb ./test_debug // 启动gdb,指定调试⽂件为test_debug#target remote 192.168.2.107:2345 //与gdbserver建⽴连接5.1连接成功,便使⽤gdb命令来调试列出所有源代码break [file]:[row]打断点,⽐如:break test_debug.c:21 //在test_debug.c⽂件的第21⾏处打断点info br查看断点info file列出当前的⽂件,共享库。
一,GDB调试器简介GDB是Linux下的常用调试器,主要用于调试源代码、调试运行中的进程和查看core dump文件。
Linux下的调试器主要有gdb、cgdb、ddd、eclipse。
GDB调试器的运行速度快、能够进行源代码同步显示。
使用-tui 选项开启gdb命令输入和源代码的分屏显示,tui即Terminal User Interface。
二,GDB常用调试命令a)调试可执行文件以源代码为/home/zebra/目录下的test.c文件产生的可执行文件test为例(可执行文件使用gcc进行编译,并使用-g选项以产生调试信息),进行命令的说明(详细源代码参见第三部分:三,调试实例分析 )。
gdb调试源代码流程:1,开启gdb程序,即运行如下命令:gdb -q (-q用以使得gdb不输出gdb程序的版本等信息)2,指定调试的二进制文件:file test3,list查看源代码4,设定断点breakpoint mainbreakpoint sub上述分别在main函数和sub函数处设定了断点。
断点可以设置在任意已知源代码文件的某一行,某一个函数,同时可以指定是设置在哪个/哪些线程上(见下边描述)。
5,运行可执行文件:run6,这样程序会运行到断点处停止下来,gdb会打印当前断点的信息。
7,使用s 或者n进行单步调试。
s即step,n即next都是执行一条语句,然后停下来。
如果想执行一条汇编语句,则可以使用si ,ni,即step instruction,next instruction。
8,bt命令查看当前的调用栈,bt即backtrace。
9,info frame查看函数帧信息。
10,frame n 进入某个函数帧(编号为n)11,info 命令可以对当前的函数帧的寄存器、局部变量、函数的参数进行查看。
info register;info local;info args。
12,disassemble对当前函数对应的二进制进行反汇编。
linux gdb调试工具介绍一:列文件清单1.List(gdb) list line1,line2二:执行程序要想运行准备调试的程序,可使用run命令,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出说明符(<和>)和外壳通配符(*、?、[、])在内。
如果你使用不带参数的run命令,gdb就再次使用你给予前一条run命令的参数,这是很有用的。
利用set args 命令就可以修改发送给程序的参数,而使用show args 命令就可以查看其缺省参数的列表。
(gdb)set args –b –x(gdb) show argsbacktrace命令为堆栈提供向后跟踪功能。
Backtrace 命令产生一张列表,包含着从最近的过程开始的所以有效过程和调用这些过程的参数。
三:显示数据利用print 命令可以检查各个变量的值。
(gdb) print p (p为变量名)whatis 命令可以显示某个变量的类型(gdb) whatis ptype = int *print 是gdb的一个功能很强的命令,利用它可以显示被调试的语言中任何有效的表达式。
表达式除了包含你程序中的变量外,还可以包含以下内容:l 对程序中函数的调用(gdb) print find_entry(1,0)l 数据结构和其他复杂对象(gdb) print *table_start$8={e=reference=’\000’,location=0x0,next=0x0}l 值的历史成分(gdb)print $1 ($1为历史记录变量,在以后可以直接引用$1 的值)l 人为数组人为数组提供了一种去显示存储器块(数组节或动态分配的存储区)内容的方法。
早期的调试程序没有很好的方法将任意的指针换成一个数组。
就像对待参数一样,让我们查看内存中在变量h后面的10个整数,一个动态数组的语法如下所示:base@length因此,要想显示在h后面的10个元素,可以使用h@10:(gdb)print h@10$13=(-1,345,23,-234,0,0,0,98,345,10)四:断点(breakpoint)break命令(可以简写为b)可以用来在调试的程序中设置断点,该命令有如下四种形式:l break line-number 使程序恰好在执行给定行之前停止。
Linux终端命令解析gdb命令详解Linux终端命令解析:gdb命令详解GDB(GNU Debugger)是一个功能强大的调试工具,它可以帮助程序员跟踪和调试程序。
在Linux终端中,通过使用GDB命令,我们可以深入分析代码,查找和修复错误。
本文将详细介绍GDB的常用命令和其功能。
一、启动GDB在终端中执行以下命令来启动GDB:gdb <可执行文件><可执行文件>表示你要调试的可执行文件的路径。
启动GDB后,会出现一个类似于"gdb>"的提示符。
下面是一些常用的GDB命令:1. 设置断点:- break <函数名>:在指定函数名处设置断点。
- break <行号>:在指定行号处设置断点。
- break <文件名:行号>:在指定文件的行号处设置断点。
2. 运行程序:- run:开始执行程序。
如果设置了断点,程序会在第一个断点处停下来。
- continue:继续执行程序,直到遇到下一个断点或程序结束。
3. 执行代码:- next:执行下一行代码,并跳过函数调用。
- step:执行下一行代码,包括函数调用。
- finish:执行当前函数的剩余部分,并停在函数调用的下一行。
4. 查看变量:- print <变量名>:打印指定变量的值。
- display <变量名>:在每次停下来时显示指定变量的值。
- watch <变量名>:当指定变量的值发生变化时,停下来。
5. 查看堆栈:- backtrace:显示当前的函数调用堆栈。
- frame <帧号>:切换到指定帧号的堆栈帧。
6. 修改程序状态:- set <变量名>=<值>:修改指定变量的值。
- return <值>:以指定的值结束当前函数。
7. 退出GDB:- quit:退出GDB。
以上只是GDB的一些常用命令,可以帮助我们进行简单的调试操作。
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将会给出相应的提示。
Linux中包含有一个很有用的调试工具--gdb(GNU Debuger),它可以用来调试C和C++程序,功能不亚于Windows下的许多图形界面的调试工具。
和所有常用的调试工具一样,gdb提供了以下功能:# 监视程序中变量的值# 在程序中设置断点# 程序的单步执行在使用gdb前,必须先载入可执行文件,因为要进行调试,文件中就必须包含调试信息,所以在用gcc或cc编译时就需要用-g参数来打开程序的调试选项。
调试开始时,必须先载入要进行调试的程序,可以用以下两种方式:* 在启动gdb后执行以下命令:file 可执行文件路径* 在gdb启动时就载入程序:gdb 可执行文件路径载入程序后,接下来就是要进行断点的设置,要监视的变量的添加等工作,下面对在这个过程中常会用到的命令逐一进行介绍:* list:显示程序中的代码,常用使用格式有:list输出从上次调用list命令开始往后的10行程序代码。
list -输出从上次调用list命令开始往前的10行程序代码。
list n输出第n行附近的10行程序代码。
list function输出函数function前后的10行程序代码。
* forward/search:从当前行向后查找匹配某个字符串的程序行。
使用格式:forward/search 字符串查找到的行号将保存在$_变量中,可以用print $_命令来查看。
* reverse-search:和forward/search相反,向前查找字符串。
使用格式同上。
* break:在程序中设置断点,当程序运行到指定行上时,会暂停执行。
使用格式:break 要设置断点的行号* tbreak:设置临时断点,在设置之后只起作用一次。
使用格式:tbreak 要设置临时断点的行号* clear:和break相反,clear用于清除断点。
使用格式:clear 要清除的断点所在的行号* run:启动程序,在run后面带上参数可以传递给正在调试的程序。
GDB使用说明GDB使用说明1、简介GDB(GNU调试器)是一个功能强大的开源调试工具,用于调试C、C++、Fortran等编程语言的程序。
本文档将提供详细的GDB使用说明,包括安装、启动、基本命令以及高级功能的介绍。
2、安装a) 在Linux上安装GDB:在终端中运行以下命令安装GDB:```sudo apt-get install gdb```b) 在Windows上安装GDB:从GDB官方网站最新的Windows 安装包,并按照安装向导进行安装。
3、启动GDBa) 在Linux上启动GDB:在终端中运行以下命令启动GDB:```gdb [可执行文件名]```b) 在Windows上启动GDB:在命令提示符中切换到GDB的安装目录,然后执行以下命令启动GDB:```gdb:exe [可执行文件名]```4、基本命令a) 运行程序- `run`:开始执行程序。
- `r`:运行程序的简写形式。
b) 设置断点- `break [行号]`:在指定行号设置断点。
- `b [行号]`:设置断点的简写形式。
- `break [函数名]`:在指定函数设置断点。
- `b [函数名]`:设置断点的简写形式。
c) 单步执行- `next`:执行下一行语句。
- `n`:`next`命令的简写形式。
- `step`:进入函数内部执行。
- `s`:`step`命令的简写形式。
d) 打印变量- `print [变量名]`:打印指定变量的值。
- `p [变量名]`:`print`命令的简写形式。
e) 查看栈信息- `bt`:查看完整的栈回溯信息。
- `backtrace`:`bt`命令的完整形式。
f) 调试多线程程序- `info threads`:查看线程信息。
- `thread [线程号]`:切换到指定线程。
5、高级功能a) 控制程序的执行- `continue`:从当前位置继续执行程序。
- `c`:`continue`命令的简写形式。
gdb调试命令的使用及总结gdb是一种功能强大的调试工具,用于帮助开发人员诊断和解决程序中的错误。
通过使用gdb,开发人员可以检查程序的内部状态、变量的值以及程序的执行流程,从而更好地理解程序的行为并找到问题所在。
在使用gdb进行调试时,有一些常用的命令可以帮助我们进行调试。
下面是一些常用的gdb调试命令及其使用方法的总结。
1. 启动程序:可以使用gdb命令后跟可执行程序的路径来启动程序。
例如:gdb ./program。
2. 设置断点:可以使用break命令来设置断点。
例如:break main 可以在程序的main函数处设置断点。
3. 运行程序:可以使用run命令来运行程序。
例如:run可以开始执行程序。
4. 单步执行:可以使用step命令来逐行执行程序。
例如:step可以执行当前行并进入函数。
5. 继续执行:可以使用continue命令来继续执行程序。
例如:continue可以继续执行程序直到下一个断点。
6. 打印变量的值:可以使用print命令来打印变量的值。
例如:print variable可以打印变量的值。
7. 查看函数调用栈:可以使用backtrace命令来查看函数调用栈。
例如:backtrace可以显示当前函数的调用栈。
8. 修改变量的值:可以使用set命令来修改变量的值。
例如:set variable = value可以修改变量的值。
9. 查看内存内容:可以使用x命令来查看内存的内容。
例如:x /nfu address可以以指定格式查看指定地址的内存内容。
10. 查看寄存器的值:可以使用info registers命令来查看寄存器的值。
例如:info registers可以显示当前寄存器的值。
11. 跟踪程序执行时间:可以使用set pagination off命令来关闭分页显示功能。
例如:set pagination off可以关闭分页显示。
总结:gdb是一种强大的调试工具,可以帮助开发人员定位和解决程序中的错误。
linux下的应用程序GDB调试方法对于linux程序下的C设计,要有好的程序设计规范,能使得程序在调试过程中节省很多时间。
而常出现类似于指针的段错误没有丰富的调试经验之下,一下子难得排错成功,所在要借助其它软件的来调试。
GDB是个不错的选择!GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。
或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。
所谓“寸有所长,尺有所短”就是这个道理。
一般来说,GDB主要帮忙你完成下面四个方面的功能:1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。
(断点可以是条件表达式)3、当程序被停住时,可以检查此时你的程序中所发生的事。
4、动态的改变你程序的执行环境。
从上面看来,GDB和一般的调试工具没有什么两样,基本上也是完成这些功能,不过在细节上,你会发现GDB这个调试工具的强大,大家可能比较习惯了图形化的调试工具,但有时候,命令行的调试工具却有着图形化工具所不能完成的功能。
让我们一一看来。
一个调试示例源程序:tst.c1 #include23 int func(int n)4 {5 int sum=0,i;6 for(i=0; i7 {8 sum+=i;9 }10 return sum;11 }121314 main()15 {16 int i;17 long result = 0;18 for(i=1; i<=100; i++)19 {20 result += i;21 }2223 printf("result[1-100] = %d ", result );24 printf("result[1-250] = %d ", func(250) );25 }编译生成执行文件:(Linux下)hchen/test> cc -g tst.c -o tst使用GDB调试:hchen/test> gdb tst <---------- 启动GDBGNU gdb 5.1.1Copyright 2002 Free Software Foundation, Inc.GDB is free software, covered by the GNU General Public License, and you arewelcome to change it and/or distribute copies of it under certain conditions.Type "show copying" to see the conditions.There is absolutely no warranty for GDB. Type "show warranty" for details.This GDB was configured as "i386-suse-linux"...(gdb) l <-------------------- l命令相当于list,从第一行开始例出原码。
教你在Linux下用GDB调试程序一、使用GDB一般来说GDB主要调试的是C/C++的程序。
要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。
使用编译器(cc/gcc/g++)的-g参数可以做到这一点。
如:$gcc-g-Wall hello.c-o hello$g++-g-Wall hello.cpp-o hello如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。
当你用-g把调试信息加入之后,并成功编译目标代码以后,让我们来看看如何用gdb来调试他。
启动GDB的方法有以下几种:•gdb<program>program也就是你的执行文件,一般在当前目录下。
•gdb<program>core用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。
•gdb<program><PID>如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。
gdb会自动attach上去,并调试他。
program应该在PATH环境变量中搜索得到。
GDB启动时,可以加上一些GDB的启动开关,详细的开关可以用gdb-help查看。
我在下面只例举一些比较常用的参数:-symbols<file>-s<file>从指定文件中读取符号表。
-se file从指定文件中读取符号表信息,并把他用在可执行文件中。
-core<file>-c<file>调试时core dump的core文件。
-directory<directory>-d<directory>加入一个源文件的搜索路径。
默认搜索路径是环境变量中PATH所定义的路径。
二、GDB的命令概貌启动gdb后,你就被带入gdb的调试环境中,就可以使用gdb的命令开始调试程序了,gdb 的命令可以使用help命令来查看,如下所示:GNU gdb6.7.1-debianCopyright(C)2007Free Software Foundation,Inc.License GPLv3+:GNU GPL version3or later</licenses/gpl.html>This is free software:you are free to change and redistribute it.There is NO WARRANTY,to the extent permitted by law.Type"show copying"and"show warranty"for details.This GDB was configured as"i486-linux-gnu".(gdb)helpList of classes of commands:aliases--Aliases of other commandsbreakpoints--Making program stop at certain pointsdata--Examining datafiles--Specifying and examining filesinternals--Maintenance commandsobscure--Obscure featuresrunning--Running the programstack--Examining the stackstatus--Status inquiriessupport--Support facilitiestracepoints--Tracing of program execution without stopping the programuser-defined--User-defined commandsType"help"followed by a class name for a list of commands in that class.Type"help all"for the list of all commands.Type"help"followed by command name for full documentation.Type"apropos word"to search for commands related to"word".Command name abbreviations are allowed if unambiguous.(gdb)gdb的命令很多,gdb把之分成许多个种类。
gdb调试命令的使用及总结gdb是一个强大的调试工具,可以帮助程序员定位和解决代码中的错误。
下面将介绍一些常用的gdb调试命令及其使用方法。
1. 启动程序要使用gdb调试一个可执行文件,可以使用以下命令启动程序:```gdb <可执行文件路径>```2. 设置断点断点是在程序执行过程中停止的位置。
可以使用以下命令设置断点:```break <文件名:行号>```例如,要在文件main.c的第10行设置断点,可以使用以下命令:```break main.c:10```3. 运行程序使用以下命令来运行程序:```run```4. 单步执行使用以下命令可以逐行执行程序:```next```5. 查看变量的值要查看变量的值,可以使用以下命令:```print <变量名>```例如,要查看变量x的值,可以使用以下命令:```print x```6. 修改变量的值在gdb中,可以直接修改变量的值。
使用以下命令可以修改变量的值:```set <变量名>=<新值>```例如,要将变量x的值修改为10,可以使用以下命令:```set x=10```7. 继续执行程序如果程序在断点处停止,可以使用以下命令继续执行程序:```continue```8. 退出调试要退出gdb调试,可以使用以下命令:```quit```gdb调试命令的使用非常简单,但它能够帮助程序员快速定位和修复代码中的错误。
通过设置断点、逐行执行、查看和修改变量的值,以及继续执行程序等命令,可以更加高效地进行调试工作。
希望本文能帮助读者更好地学习和使用gdb调试工具。
Linux命令高级技巧使用gdb命令进行程序调试和分析在Linux环境中,gdb是程序员们常用的工具之一,用于调试和分析程序。
gdb是GNU调试器的缩写,它提供了多种功能和选项,能够帮助程序员追踪程序的执行过程,找出错误并进行修复。
本文将介绍一些使用gdb进行程序调试和分析的高级技巧,希望能对读者有所帮助。
一、gdb简介gdb是一个功能强大的调试工具,它可以在程序执行过程中暂停程序,并允许程序员查看、修改程序状态。
gdb支持多种编程语言,包括C、C++、Fortran等。
使用gdb可以帮助程序员分析程序的执行流程、内存使用情况以及变量状态等,从而帮助定位并解决程序的bug。
二、基本调试技巧1. 启动程序调试使用gdb调试程序时,需要在命令行中输入"gdb 程序名"的命令来启动gdb。
例如,要调试一个名为"test"的程序,可以输入以下命令:```gdb test```2. 设置断点断点是gdb中非常有用的功能,可以在程序中指定位置设置断点,使程序执行到该位置时暂停。
通过暂停程序的执行,可以查看程序中的变量值以及执行流程,有助于定位问题。
设置断点的命令是"break"或"b",后跟着要设置断点的位置。
例如,要在程序的第10行设置断点,可以输入以下命令:```break 10```3. 执行程序在设置好断点后,可以使用"gdb"命令来开始执行程序。
程序将会运行到第一个断点处暂停。
4. 单步执行单步执行是gdb中常用的调试技巧之一,可以逐行执行程序,方便查看程序的执行过程。
gdb提供了多种单步执行的命令,包括"step"和"next"。
- "step"命令用于逐行执行程序,包括进入函数内部。
如果当前行是函数调用语句,gdb将进入该函数,然后停在函数内部的第一行。