最新GDB学习资料

合集下载

gdb调试命令的使用及总结

gdb调试命令的使用及总结

gdb调试命令的使用及总结
gdb是一个功能强大的调试器,用于调试C、C++等编程语言的程序。

它提供了许多命令和功能,可以帮助开发人员诊断和修复程序中的错误。

下面我将从使用和总结两个方面来回答你的问题。

首先是gdb的使用。

要使用gdb调试程序,首先需要在编译时包含调试信息。

这意味着在使用gcc或g++编译程序时,需要添加`-g`选项。

例如:
gcc -g -o program program.c.
然后可以使用以下命令启动gdb并加载程序:
gdb program.
一旦进入gdb,可以使用一系列命令来控制程序的执行和检查程序状态。

例如,可以使用`run`命令来运行程序,`break`命令来设置断点,`step`和`next`命令来逐行执行程序等等。

此外,还可以使用`print`命令来打印变量的值,`backtrace`命令来查看函数调用栈等等。

现在来总结一下gdb的使用。

gdb是一个非常强大的调试工具,它可以帮助开发人员快速定位和修复程序中的错误。

通过设置断点、逐行执行程序、查看变量的值等操作,开发人员可以深入了解程序
的执行过程,找出其中的问题。

此外,gdb还提供了丰富的文档和
在线帮助,可以帮助开发人员更好地利用它的功能。

总的来说,gdb是一个非常有用的调试工具,它可以帮助开发
人员提高程序调试的效率和准确性。

通过学习和熟练掌握gdb的使用,开发人员可以更快地修复程序中的错误,提高自己的编程水平。

希望这个回答能够帮助你更好地了解gdb的使用和功能。

100个gdb小技巧

100个gdb小技巧

100个gdb小技巧(最新版4篇)目录(篇1)1.引言2.gdb基本用法3.gdb高级用法4.gdb在调试中的应用5.结论正文(篇1)gdb是一个强大的调试工具,对于程序员来说,熟练掌握gdb的使用技巧是非常重要的。

以下是100个gdb小技巧,帮助您更好地利用gdb进行调试。

1.在gdb启动时,可以指定要调试的可执行文件的路径。

例如,如果可执行文件名为“myprogram”,则可以使用以下命令启动gdb:gdb/path/to/myprogram2.在gdb中,可以使用“run”命令来运行程序,并使用“break”命令在指定的行上设置断点。

例如,如果要在第10行设置断点,则可以使用以下命令:break 103.在gdb中,可以使用“next”命令来逐行执行程序,使用“step”命令来进入函数调用,使用“continue”命令来继续运行程序。

例如,如果要从第10行开始逐行执行程序,则可以使用以下命令:next或step 104.在gdb中,可以使用“delete”命令来删除已经设置的断点。

例如,如果要删除第10行的断点,则可以使用以下命令:delete 105.在gdb中,可以使用“info”命令来查看当前的状态信息,例如变量值、调用栈等。

例如,如果要查看变量x的值,则可以使用以下命令:info variables x6.在gdb中,可以使用“print”命令来查看变量的值。

例如,如果要查看变量x的值,则可以使用以下命令:print x7.在gdb中,可以使用“display”命令来显示变量的值。

例如,如果要显示变量x的值并在程序运行时更新显示结果,则可以使用以下命令:display x8.在gdb中,可以使用“watch”命令来监视一个变量的值的变化。

例如,如果要监视变量x的变化并打印出每次的变化结果,则可以使用以下命令:watch x9.在gdb中,可以使用“set”命令来设置程序的运行环境。

gdb 使用方法

gdb 使用方法

gdb 使用方法GDB是GNUDebugger的缩写,是一种强大的调试工具,可以用于C、C++、汇编等语言的程序调试。

在本文中,我们将介绍 GDB 的一些基本使用方法。

1. 编译程序在使用 GDB 调试程序之前,首先需要编译程序,以便在调试时能够获取程序的符号表信息。

在编译时,需要使用 -g 选项生成调试信息。

例如:```shell$ gcc -g -o my_program my_program.c```2. 启动 GDB启动 GDB 的方法很简单,只需要在命令行中输入 gdb 命令,后跟要调试的程序的名称。

例如:```shell$ gdb my_program```3. 设置断点在程序中设置断点可以帮助我们在程序执行到特定位置时停下来,方便我们进行调试。

在 GDB 中,可以使用 break 命令设置断点。

例如:```shell(gdb) break main```上面的命令会在程序执行到 main 函数时设置一个断点。

4. 运行程序在设置好断点之后,可以使用 run 命令运行程序。

例如:```shell(gdb) run```5. 调试程序程序运行过程中,可以使用 GDB 提供的一些命令进行调试。

例如:- step:单步执行程序,进入函数内部。

- next:单步执行程序,不进入函数内部。

- print:打印变量的值。

- watch:监视一个变量,当变量的值发生变化时停下来。

- continue:继续执行程序直到遇到下一个断点或程序结束。

6. 查看程序状态在调试程序时,可以使用 GDB 提供的一些命令查看程序的状态。

例如:- info breakpoints:查看当前设置的断点。

- info locals:查看当前函数的局部变量。

- info registers:查看当前 CPU 寄存器的值。

- info threads:查看当前程序中的线程信息。

7. 退出 GDB在调试完成后,可以使用 quit 命令退出 GDB。

gdb调试命令的使用及总结

gdb调试命令的使用及总结

gdb调试命令的使用及总结GDB是GNU调试器的简称,是一个非常强大的调试工具,可用于调试C、C++等编程语言的程序。

通过GDB,开发人员可以在程序运行过程中查看变量的值、跟踪函数的执行、定位错误的原因等。

下面将介绍一些常用的GDB调试命令及其使用方法。

1. 启动GDB调试器:在命令行中输入"gdb"命令即可启动GDB调试器。

然后使用"gdb <可执行文件名>"命令加载要调试的可执行文件。

2. 设置断点:使用"break <行号>"命令在指定行号上设置断点。

可以使用"break <函数名>"命令在指定函数的入口处设置断点。

使用"info breakpoints"命令可以查看当前设置的断点。

3. 运行程序:使用"run"命令运行程序。

如果程序需要输入参数,则可以使用"run <参数1> <参数2> ..."的形式运行。

4. 单步执行:在断点处停下来后,可以使用"next"命令执行下一行代码。

使用"step"命令进入函数内部执行。

使用"finish"命令执行完当前函数并返回上一层调用。

5. 查看变量值:使用"print <变量名>"命令可以查看指定变量的值。

使用"display <变量名>"命令可以设置自动显示变量值。

6. 查看堆栈信息:使用"backtrace"命令可以查看函数调用的堆栈信息。

使用"frame <帧号>"命令可以切换到指定的堆栈帧。

7. 修改变量值:使用"set <变量名>=<新值>"命令可以修改指定变量的值。

gdb 汇编常见命令

gdb 汇编常见命令

gdb 汇编常见命令1.引言1.1 概述概述部分的内容可以简要介绍一下gdb和汇编语言的概念。

GDB是GNU Debugger的缩写,是一个功能强大的调试工具,用于帮助开发人员调试程序。

它可以与众多编程语言一起使用,包括汇编语言。

汇编语言是一种低级别的程序设计语言,用于直接操作计算机硬件。

本文将重点介绍gdb在汇编语言中的常见命令。

通过熟悉这些命令,开发人员可以更好地理解和调试汇编程序,提高程序的运行效率和稳定性。

文章后续部分将详细介绍常见的gdb命令和它们在汇编程序中的应用场景。

首先,我们将介绍常见命令1,在此命令中,我们将学习如何设置断点、单步执行程序、查看寄存器的值等。

然后,我们将进一步探讨常见命令2,该命令将介绍如何查看内存中的数据、修改内存值以及使用条件断点等。

通过本文,读者将能够掌握这些常见的gdb命令,并能够熟练运用它们进行汇编程序的调试。

最后,在结论部分,我们将对本文进行总结,并展望未来gdb在汇编语言调试中的应用前景。

接下来,我们将详细介绍2.1 常见命令1部分的内容。

1.2 文章结构文章结构部分的内容可以参考以下内容:文章结构部分介绍了整篇文章的组织结构和内容安排,旨在为读者提供一个清晰的框架和导引,使读者能够更好地理解和掌握文章内容。

在本文中,结构主要分为三个部分:引言、正文和结论。

引言部分首先对文章的主题进行了概述,简要介绍了gdb汇编调试工具的基本概念和作用。

接着,介绍了本文的结构,包括引言、正文和结论三个部分以及各个部分的内容安排。

最后,明确了本文的目的,旨在帮助读者掌握gdb汇编调试工具的常见命令。

正文部分是本文的核心内容,主要介绍了gdb汇编调试工具的常见命令。

这些命令包括但不限于断点设置、步进执行、变量查看、寄存器查看等。

每个命令都会详细解释其作用和用法,并通过实例进行演示,以便读者能够更好地理解和掌握。

结论部分对整篇文章进行总结,并展望了未来可能的研究方向和进一步探索的问题。

GDB大全

GDB大全

GDB大全GDB是一个强大的命令行调试工具。

虽然X Window提供了GDB的图形版DDD,但是我仍然更钟爱在命令行模式下使用GDB。

大家知道命令行的强大就是在于,其可以形成执行序列,形成脚本。

UNIX下的软件全是命令行的,这给程序开发提代供了极大的便利,命令行软件的优势在于,它们可以非常容易的集成在一起,使用几个简单的已有工具的命令,就可以做出一个非常强大的功能。

于是UNIX下的软件比Windows下的软件更能有机地结合,各自发挥各自的长处,组合成更为强劲的功能。

而Windows下的图形软件基本上是各自为营,互相不能调用,很不利于各种软件的相互集成。

在这里并不是要和Windows做个什么比较,所谓“寸有所长,尺有所短”,图形化工具还是有不如命令行的地方。

1 GDB概述GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。

或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。

所谓“寸有所长,尺有所短”就是这个道理。

一般来说,GDB主要帮忙你完成下面四个方面的功能:1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。

2、可让被调试的程序在你所指定的调置的断点处停住。

(断点可以是条件表达式)3、当程序被停住时,可以检查此时你的程序中所发生的事。

4、动态的改变你程序的执行环境。

从上面看来,GDB和一般的调试工具没有什么两样,基本上也是完成这些功能,不过在细节上,你会发现GDB这个调试工具的强大,大家可能比较习惯了图形化的调试工具,但有时候,命令行的调试工具却有着图形化工具所不能完成的功能。

一个调试示例源程序:tst.c代码:1 #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()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下)root@linux:/home/benben/test# gcc -g tst.c -o tst使用GDB调试:代码:root@linux:/home/benben/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 are welcome 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,从第一行开始例出原码。

GDB调试技巧与实战

GDB调试技巧与实战

GDB调试技巧与实战GDB(GNU调试器)是一种强大的调试工具,广泛用于C/C++程序的调试。

它具有许多有用的功能和命令,可以帮助我们快速定位和解决程序中的bug。

在本文中,我将介绍一些GDB调试技巧和实例,帮助您更好地使用GDB进行调试工作。

1. 启动程序:要使用GDB调试程序,我们需要在启动GDB时将程序作为参数传递给它。

例如,要调试名为myprogram的可执行文件,可以使用以下命令启动GDB:```gdb myprogram```2. 设置断点:当我们想要在特定位置暂停程序执行时,可以在该位置设置断点。

使用GDB的"break"命令可以实现。

例如,要在程序的main 函数处设置断点,可以使用以下命令:```break main```我们还可以使用行号来设置断点,例如:```break file.c:10```3. 运行程序:设置了断点后,我们可以使用GDB的"run"命令来运行程序。

程序会在达到断点时暂停执行。

例如:```run```如果程序需要命令行参数,我们可以在run命令后面添加参数。

例如:```run arg1 arg2```4. 单步调试:一旦程序暂停在断点处,可以使用GDB的"step"命令逐行执行程序。

这对于理解程序的执行流程非常有用。

例如:```step```如果希望在函数内部逐行执行,可以使用"next"命令。

它会跳过函数内部的细节,直接进入下一行。

例如:```next```5. 打印变量:在调试程序时,我们经常需要查看变量的值。

GDB的"print"命令可以用于打印变量的值。

例如,要打印整型变量x的值,可以使用以下命令:```print x```我们还可以使用GDB的表达式语言来计算表达式的值。

例如,要打印变量x和y的和,可以使用以下命令:```print x + y```6. 查看堆栈:GDB可以帮助我们查看程序的堆栈跟踪信息。

gdb常用命令详解

gdb常用命令详解

一、显示源代码GDB 可以打印出所调试程序的源代码,当然,在程序编译时一定要加上-g的参数,把源程序信息编译到执行文件中。

不然就看不到源程序了。

当程序停下来以后,GDB会报告程序停在了那个文件的第几行上。

你可以用list命令来打印程序的源代码。

还是来看一看查看源代码的GDB命令吧。

list显示程序第linenum行的周围的源程序。

list显示函数名为function的函数的源程序。

list显示当前行后面的源程序。

list -显示当前行前面的源程序。

一般是打印当前行的上5行和下5行,如果显示函数是是上2行下8行,默认是10行,当然,你也可以定制显示的范围,使用下面命令可以设置一次显示源程序的行数。

set listsize设置一次显示源代码的行数。

show listsize查看当前listsize的设置。

list命令还有下面的用法:list ,显示从first行到last行之间的源代码。

list ,显示从当前行到last行之间的源代码。

list +往后显示源代码。

一般来说在list后面可以跟以下这们的参数:行号。

<+offset> 当前行号的正偏移量。

<-offset> 当前行号的负偏移量。

哪个文件的哪一行。

函数名。

哪个文件中的哪个函数。

<*address> 程序运行时的语句在内存中的地址。

二、搜索源代码不仅如此,GDB还提供了源代码搜索的命令:forward-searchsearch向前面搜索。

reverse-search全部搜索。

其中,就是正则表达式,也主一个字符串的匹配模式,关于正则表达式,我就不在这里讲了,还请各位查看相关资料。

三、指定源文件的路径某些时候,用-g编译过后的执行程序中只是包括了源文件的名字,没有路径名。

GDB提供了可以让你指定源文件的路径的命令,以便GDB进行搜索。

directorydir加一个源文件路径到当前路径的前面。

如果你要指定多个路径,UNIX下你可以使用“:”,Windows下你可以使用“;”。

GDB基本命令(整合)

GDB基本命令(整合)

GDB基本命令(整合)一、gdb调试基本知识a.调试器指示的是将要执行的代码行b.只有在编译时拥有调试符号(-g)的程序才能在调试时看到源码c.同一行上有多个断点时,gdb仅中断在断点号最小的那个断点上d.断点可以设置在同一程序的不同文件中e.在任何给定时间,gdb只有一个焦点,即当前“活动”的文件f.源文件改变后,断点发生移动,带式断点属性的行号不变二、GDB基本命令清单查询在 gdb 提示符处键入help,将列出命令的分类,主要的分类有:* aliases:命令别名* breakpoints:断点定义;* data:数据查看;* files:指定并查看文件;* internals:维护命令;* running:程序执行;* stack:调用栈查看;* statu:状态查看;* tracepoints:跟踪程序执行。

键入 help 后跟命令的分类名(如help aliases),可获得该类命令的详细清单。

三、GDB基本命令用法1、运行退出run(简写r):执行程序(gdb)run app [argv1] [argv2] ...run命令后可跟随发给该程序的任何参数,包括标准输入和标准输出说明符(<和>)和外壳通配符(*、?、[、])在内。

如果使用不带参数的run命令,gdb就再次使用前一条run命令的参数。

set args:设定传递给程序的参数(gdb)set args [argv1] [argv2] ...show args:查看其缺省参数的列表(gdb)show argskill(简写k):异常终止在gdb 控制下运行的程序(gdb)killquit(简写q):退出gdb(gdb)quit2、查看信息list(简写l):查看源码(gdb) list line_num或l line_num,line_num为行号。

pirnt(简写p):print var:查看变量var的值。

(gdb) print var可以通过添加参数来设置输出格式:/x 按十六进制格式显示变量/d 按十进制格式显示变量/u 按十六进制格式显示无符号整型/o 按八进制格式显示变量/t 按二进制格式显示变量/a 按十六进制格式显示变量/c 按字符格式显示变量/f 按浮点数格式显示变量例如:print /x varprint可以显示被调试的语言中任何有效的表达式。

GDB_命令详解

GDB_命令详解

GDB 命令详细解释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后面带上参数可以传递给正在调试的程序。

9.GDB应用基础

9.GDB应用基础

启动GDB

启动时。可以加上一些GDB的启动选项: 1. -symbols<file>/ -s <file> //从指定文件中读取符号表 2. -se file //从指定文件中读取符号表信息,并把它用 在可执行文件中。 3. -core<file> /-c <file> //调试时core dump的core文件 4. -directory <directory>/-d<directory> //加入一个源文件 的搜索路径。 默认搜索路径是环境变量中PATH所定义的路径。
GDB test //启动GDB (gdb) l //命令相当于list,从第一行开始列出源码 #include<stdio.h> int func(int n) {int sum=0,i; for(i=0;i<n;i++) {sum+=i; } return sum; (gdb) //直接按回车键表示重复上一次命令 } main() {int i=; long result=0; for(i=1;i<=100;i++) { result+=i; } (gdb) break; //设置断点 Breakpoint 1 at 0x8048496: file test.c; (gdb) break func; //设置断点,在函数func()入口处 Breakpoint 2 at 0x8048456: file test.c;
运行代码

Gdb默认从首行开始运行代码,可键入“r”(run)即可 (若想从程序中指定行开始运行,可在r 后面加上行号)。 例:(Gdb) r Starting program: /root/workplace/Gdb/test Reading symbols from shared object read from target memory ...done. Loaded system supplied DSO at 0x5fb000 Breakpoint 1, main () at test.c:6 6 sum(50); 程序运行到断点处就停止了。

GDB手册中文版

GDB手册中文版

GDB用户手册目录目录 (1)摘要 (2)自由软件 (2)自由软件急需自由文档 (2)GDB的贡献者们 (4)1.一个简单的GDB会话 (8)2.征服GDB的进与出 (13)2.1调用GDB (13)2.1.1 选择文件 (14)2.1.2 选择模式 (16)2.1.3 启动期间,GDB做了什么 (19)2.2 退出GDB (20)2.3 Shell命令 (21)2.4 Loging输出 (21)3.GDB命令 (22)3.1命令语法 (22)3.2命令完成 (23)3.3获得帮助 (25)4.在GDB下运行程序 (29)4.1 适合调试的编译 (29)4.2 启动程序 (30)4.3 程序的参数 (32)4.4 程序的环境 (32)4.5 程序的工作目录 (34)4.6 程序的输入输出 (35)4.7 调试某个已运行的进程 (36)4.8 杀掉子进程 (37)4.9 多线程程序的调试 (37)4.10 多进程程序的调试 (40)5.0停止与继续 (42)摘要象GDB这样的调试程序,目的就是让你可以查看其它程序的内部运行过程,或者是在它崩溃的那一时刻它在做什么。

GDB能做4件事(这些还需附加其他的一些事),帮助你捕获在场的错误:·启动程序,设定任何可以影响它行为的东西。

·在特定的条件下使程序停止。

·当程序停止时,分析发生了什么。

·改变程序里的一些东西,进行一个由于bug所导致的结果的矫正性试验,同时继续了解另外一个bug。

可以使用GDB调试用C和C++编写的程序,更多信息参见支持的语言,及C与C++。

部分支持Modula-2,Modula-2的更多信息参见Modula-2。

在调试使用sets、subranges、file variables或嵌套函数的Pascal程序时,目前不能工作。

GDB不支持entering expressions、printing values或者类似特性的Pascal语法。

gdb基本用法

gdb基本用法

GDB的使用当程序出错并产生core 时快速定位出错函数的办法gdb 程序名core文件名(一般是core,也可能是core.xxxx)调试程序使用的键r run 运行.程序还没有运行前使用c cuntinue 继续运行。

运行中断后继续运行q 退出kill 终止调试的程序h help 帮助<tab> 命令补全功能step 跟入函数next 不跟入函数b breakpoint 设置断点。

用法:b 函数名对此函数进行中断b 文件名:行号对此文件中指定行中断.如果是当前文件,那么文件名与:号可以省略看当前断点数使用info break.禁止断点disable 断点号.删除delete 断点号.l list 列出代码行。

一次列10 行。

连接使用list将会滚动显示. 也可以在list 后面跟上文件名:行号watch 观察一个变量的值。

每次中断时都会显示这个变量的值p print 打印一个变量的值。

与watch不同的是print只显示一次这里在顺便说说如何改变一个value. 当你下指令p 的时候,例如你用p b,这时候你会看到b 的value, 也就是上面的$1 = 15.你也同样可以用p 来改变一个value, 例如下指令p b = 100 试试看,这时候你会发现, b 的value 就变成100 了:$1 = 100.网上抄录基本的使用方法简介前言程序代码中的错误可分为数类,除了最容易除错的语法错误,编译程序会告诉你错误所在外,大部分的错误都可以归类为执行时错误。

GDB 的功能便是寻找执行时错误。

如果没有除错程序,我们只能在程序中加入输出变量值的指令来了解程序执行的状态。

有了GDB 除错程序,我们可以设定在任何地方停止程序的执行,然后可以随意检视变量值及更动变量,并逐行执行程序。

一个除错程序执行的流程通常是这样的:1. 进入除错程序并指定可执行文件。

2. 指定程序代码所在目录。

3. 设定断点后执行程序。

gdb常用命令详解

gdb常用命令详解

gdb常用命令详解GDB是GNU调试器的缩写,是一款功能强大的调试工具。

它可以帮助开发人员定位和解决程序中的错误,提供了一系列常用命令来进行代码调试。

本文将详细介绍gdb常用命令及其用法,帮助读者更好地利用gdb进行程序调试。

以下是一些常用的gdb命令:1. 启动程序:使用gdb命令后,可以通过"run"命令启动需要调试的程序。

例如:run program。

2. 设置断点:使用"break"命令可以在程序的指定位置设置断点。

例如:break main,在程序执行到main函数时会停下来。

3. 列出断点:使用"info breakpoints"命令可以列出当前设置的所有断点。

4. 删除断点:使用"delete"命令可以删除指定的断点。

例如:delete 1,删除编号为1的断点。

5. 单步执行:使用"step"命令可以逐行执行程序,并进入函数内部。

例如:step。

6. 运行到下一个断点:使用"next"命令可以执行当前行,并跳过函数内部的执行。

例如:next。

7. 继续执行:使用"continue"命令可以继续程序的执行,直到下一个断点或程序结束。

8. 打印变量:使用"print"命令可以打印指定变量的值。

例如:print variable。

9. 查看堆栈:使用"backtrace"命令可以查看当前函数的调用堆栈。

10. 查看源代码:使用"list"命令可以查看当前位置周围的源代码。

11. 修改变量值:使用"set"命令可以修改指定变量的值。

例如:set variable = value。

12. 监视变量:使用"watch"命令可以监视指定变量的值,当该变量的值发生改变时,程序会停下来。

gdb使用指南

gdb使用指南

1.概论我们将学习使用gdb来调试通过一个通过串行线同PC相连的嵌入式系统.Gdb可以调试各种程序,包括C、C++、JA V A、PASCAL、FORAN和一些其它的语言。

包括GNU所支持的所有微处理器的汇编语言。

在gdb的所有可圈可点的特性中,有一点值得注意,就是当运行gdb的平台(宿主机)通过串行端口(或网络连接,或是其他别的方式)连接到目标板时(应用程序在板上运行),gdb 可以调试对应用程序进行调试。

这个特性不光在将GNU工具移植到一个新的操作系统或微处理器时侯很有用,对于那些使用GNU已经支持的芯片的嵌入式系统进行开发的设计人员来讲,也是非常有用的。

当gdb被适当的集成到某个嵌入式系统中的时候,它的远程调试功能允许设计人员一步一步的调试程序代码、设置断点、检验内存,并且同目标交换信息。

Gdb同目标板交换信息的能力相当强,胜过绝大多数的商业调试内核,甚至功能相当于某些低端仿真器。

2. Gdb在嵌入式领域的功能实现当调试一个远端目标设备时,gdb依靠了一个调试stub来完成其功能。

调试stub 即是嵌入式系统中一小段代码,它提供了运行gdb的宿主机和所调试的应用程序间的一个媒介。

Gdb和调试stub通过GDB串行协议进行通信。

GDB串行协议是一种基于消息的ASCII码协议,包含了诸如读写内存、查询寄存器、运行程序等命令。

由于绝大多数嵌入式系统设计人员为了最好的利用他们手中特定的硬件的特征,总是自己编写自己的stub。

所以我们有必要清楚的了解一下gdb的串行通信协议。

在后面我们会详细介绍。

为了设置断点,gdb使用内存读写命令,来无损害地将原指令用一个TRAP命令或其它类似的操作码(在此假定,被调试的应用程序是处在RAM中的,当然,如果stub 有足够好的性能,硬件也不错的话,这个条件也不是必须的)代替,使得执行该命令时,可以使得控制权转移到调试stub手中去。

在此时,调试stub的任务就是将当前场景传送给gdb (通过远程串行通信协议),然后从gdb处接收命令,该命令告诉了stub下一步该做什么。

较详细的gdb入门教程

较详细的gdb入门教程
这样,你就进入 gdb 的命令行环境里了。
其中,第一行是版本信息,倒数第二行表示正载入符号表,最后一行 (gdb) 则是** gdb 的提示符**。
请注意,若你倒数第二行有 (no debugging symbols found) 字样,请确保在编译选项里加上 -g 选项。
当然,如果你直接输入 gdb 启动,不加文件名,也可以。只是,你要使用 file 命令手动载入可执行文件。
例子:
1 (gdb) break main //main函数处设置断点 2 Breakpoint 1 at 0x874: file example.cpp, line 10. 3 (gdb) break 11 //在第11行处设置断点 4 Breakpoint 2 at 0x883: file example.cpp, line 11.
1 Starting program: /home/acceptedzhs/example 2 10 3 4 Breakpoint 1, main () at example.cpp:13 5 13 printf("%d\n",f(a)); 6 (gdb) s 7 f (x=10) at example.cpp:5 //step命令,进入了f函数内部 8 5 int ans=1; 9 (gdb)
命令:step(简写为 s) 格式:step(无参数) 作用:单步执行。若当前行有函数调用,则进入该函数内部。
但是,又有人想偷懒了。反复敲 n 与 s 依然很麻烦。怎么办呢?
gdb有个特性:若什么都不输,直接按回车,则会执行上一次执行的命令。
所以,只要开始敲个 n 或 s,然后一直敲回车就行了。
举个例子好了:
1 (gdb) b 13 2 Breakpoint 1 at 0x89b: file example.cpp, line 13. 3 (gdb) r 4 Starting program: /home/acceptedzhs/example 5 10 6 7 Breakpoint 1, main () at example.cpp:13 8 13 printf("%d\n",f(a)); 9 (gdb) n 10 3628800 11 14 return 0; 12 (gdb) [回车] //看到没,执行了上次的命令,即next 13 15 } 14 (gdb)

gdb 使用手册

gdb 使用手册

gdb O•u(bKQŒ(gdb) print p (p为变量名)print f/gdbv…N N*RŸ€ý_ˆ_:v…T}Näÿ R)u([ƒSïNå显示被调试的语言中任何有效的表达式。

表达式除了包含你程序中的变量外,可以包含以下内容:1. 对程序中函数的调用(gdb) print find_entry(1,0)2. epcn结构和其他复杂对象(gdb) print *table_start$8={e=reference=’\000’,location=0x0,next=0x0}3. P<v…历史成分(gdb)print $1 ($1为历史记录变量,W(NåT SïNåvôc¥_ u( $1 v…P<)4. Nº为数组Nº为数组提供了一种去显示存储器块(数组节或动态分配的存储区)内容的方法。

早期的调试程序没有很好的方法将任意的指针换成一个数组。

就像对待参数一样,让我们查看内存中在变量hT —bv…10N*etepÿ N N*R¨态数组的语法如下所示:base@lengthVàkdÿ ‰•`ó显示在hT —bv…10N*QC} ÿ SïNåO•u(h@10ÿ(gdb)print h@10$13=(-1,345,23,-234,0,0,0,98,345,10)q whatis T}NäSïNå显示某个变量的类型(gdb) whatis ptype = int *VÛÿ e-p¹(breakpoint)breakT}Näÿ SïNå简写为bÿ SïNåu(geW(调试的程序中设置断点,该命令有如下四种形式:q break line-number O•z ^•`pY}W(执行给定行之前停止。

3.3.2 gdb基本命令_嵌入式Linux操作系统_[共4页]

3.3.2 gdb基本命令_嵌入式Linux操作系统_[共4页]

嵌入式Linux操作系统60 $2 = 134518440在此处,为什么变量i的值为如此奇怪的一个数字呢?原因就在于程序是在断点设置的对应行之前停止的,那么在此时,并没有把i的数值赋为零,而只是一个随机的数字。

但变量n是在第四行赋值的,故在此时已经为零。

6.单步运行单步运行可以使用命令n(next)或s(step),它们之间的区别在于:若有函数调用的时候,s会进入该函数而n不会进入该函数。

因此,s就类似于Visual C++等工具中的step in,n类似与Visual C++等工具中的step over。

它们的使用如下。

(gdb) nThe sum of 1-m is 12757 for(i=1; i<=50; i++)(gdb) ssum (m=50) at test.c:1616 int i,n=0;可见,使用n后,程序显示函数sum的运行结果并向下执行,而使用s后则进入到sum函数之中单步运行。

7.恢复程序运行在查看完所需变量及堆栈情况后,就可以使用命令c(continue)恢复程序的正常运行了。

这时,它会把剩余还未执行的程序执行完,并显示剩余程序中的执行结果。

之前使用n命令恢复后的执行结果如下。

(gdb) cContinuing.The sum of 1-50 is :1275Program exited with code 031.可以看出,程序在运行完后退出,之后程序处于“停止状态”。

3.3.2 gdb基本命令gdb的命令可以通过查看help进行查找,由于gdb的命令很多,因此gdb的help将其分成了很多种类(class),用户可以通过进一步查看相关class找到相应命令。

help命令如下。

(gdb) helpList of classes of commands:aliases -- Aliases of other commandsbreakpoints -- Making program stop at certain pointsdata -- Examining datafiles -- Specifying and examining filesinternals -- Maintenance commands…Type "help" followed by a class name for a list of commands in that class.Type "help" followed by command name for full documentation.Command name abbreViations are allowed if unambiguous.上述列出了gdb各个分类的命令,注意底部的加粗部分说明其为分类命令。

gdb学习笔记

gdb学习笔记

gdb学习笔记设置断点b main; 在main()⼊⼝处b 148; 在第148⾏查看断点info b运⾏程序r单条语句执⾏n继续运⾏程序c打印变量i的值p i查看函数堆栈bt退出函数finishhelp命令只是例出gdb的命令种类,如果要看种类中的命令,可以使⽤help <class> 命令,如:help breakpoints,查看设置断点的所有命令。

也可以直接help <command>来查看命令的帮助。

TAB可补全函数名,命令名在gdb中,我们可以有以下⼏种暂停⽅式:断点(BreakPoint)、观察点(WatchPoint)、捕捉点(CatchPoint)、信号(Signals)、线程停⽌(Thread Stops)。

如果要恢复程序运⾏,可以使⽤c或是continue命令。

⼀、设置断点(BreakPoint)我们⽤break命令来设置断点。

正⾯有⼏点设置断点的⽅法:break <function>在进⼊指定函数时停住。

C++中可以使⽤class::function或function(type,type)格式来指定函数名。

break <linenum>在指定⾏号停住。

break +offsetbreak -offset在当前⾏号的前⾯或后⾯的offset⾏停住。

offiset为⾃然数。

break filename:linenum在源⽂件filename的linenum⾏处停住。

break filename:function在源⽂件filename的function函数的⼊⼝处停住。

break *address在程序运⾏的内存地址处停住。

breakbreak命令没有参数时,表⽰在下⼀条指令处停住。

break ... if <condition>...可以是上述的参数,condition表⽰条件,在条件成⽴时停住。

⽐如在循环境体中,可以设置break if i=100,表⽰当i为100时停住程序。

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

GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。

或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。

所谓“寸有所长,尺有所短”就是这个道理。

用GDB调试程序GDB概述————GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。

或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。

所谓“寸有所长,尺有所短”就是这个道理。

一般来说,GDB主要帮忙你完成下面四个方面的功能:1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。

2、可让被调试的程序在你所指定的调置的断点处停住。

(断点可以是条件表达式)3、当程序被停住时,可以检查此时你的程序中所发生的事。

4、动态的改变你程序的执行环境。

从上面看来,GDB和一般的调试工具没有什么两样,基本上也是完成这些功能,不过在细节上,你会发现GDB这个调试工具的强大,大家可能比较习惯了图形化的调试工具,但有时候,命令行的调试工具却有着图形化工具所不能完成的功能。

让我们一一看来。

一个调试示例——————源程序:tst.c1 #include <stdio.h>23 int func(int n)4 {5 int sum=0,i;6 for(i=0; i<n; i++)7 {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 n", result );24 printf("result[1-250] = %d n", 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,从第一行开始例出原码。

1 #include <stdio.h>23 int func(int n)4 {5 int sum=0,i;6 for(i=0; i<n; i++)7 {8 sum+=i;9 }10 return sum;(gdb) <-------------------- 直接回车表示,重复上一次命令11 }121314 main()15 {16 int i;17 long result = 0;18 for(i=1; i<=100; i++)19 {20 result += i;(gdb) break 16 <-------------------- 设置断点,在源程序第16行处。

Breakpoint 1 at 0x8048496: file tst.c, line 16.(gdb) break func <-------------------- 设置断点,在函数func()入口处。

Breakpoint 2 at 0x8048456: file tst.c, line 5.(gdb) info break <-------------------- 查看断点信息。

Num Type Disp Enb Address What1 breakpoint keep y 0x08048496 in main at tst.c:162 breakpoint keep y 0x08048456 in func at tst.c:5(gdb) r <--------------------- 运行程序,run命令简写Starting program: /home/hchen/test/tstBreakpoint 1, main () at tst.c:17 <---------- 在断点处停住。

17 long result = 0;(gdb) n <--------------------- 单条语句执行,next命令简写。

18 for(i=1; i<=100; i++)(gdb) n20 result += i;(gdb) n18 for(i=1; i<=100; i++)(gdb) n20 result += i;(gdb) c <--------------------- 继续运行程序,continue命令简写。

Continuing.result[1-100] = 5050 <----------程序输出。

Breakpoint 2, func (n=250) at tst.c:55 int sum=0,i;(gdb) n6 for(i=1; i<=n; i++)(gdb) p i <--------------------- 打印变量i的值,print命令简写。

$1 = 134513808(gdb) n8 sum+=i;(gdb) n6 for(i=1; i<=n; i++)(gdb) p sum$2 = 1(gdb) n8 sum+=i;(gdb) p i$3 = 2(gdb) n6 for(i=1; i<=n; i++)(gdb) p sum$4 = 3(gdb) bt <--------------------- 查看函数堆栈。

#0 func (n=250) at tst.c:5#1 0x080484e4 in main () at tst.c:24#2 0x400409ed in __libc_start_main () from /lib/libc.so.6(gdb) finish <--------------------- 退出函数。

Run till exit from #0 func (n=250) at tst.c:50x080484e4 in main () at tst.c:2424 printf("result[1-250] = %d n", func(250) );Value returned is $6 = 31375(gdb) c <--------------------- 继续运行。

Continuing.result[1-250] = 31375 <----------程序输出。

Program exited with code 027. <--------程序退出,调试结束。

(gdb) q <--------------------- 退出gdb。

hchen/test>好了,有了以上的感性认识,还是让我们来系统地认识一下gdb吧。

使用GDB————一般来说GDB主要调试的是C/C++的程序。

要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。

使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点。

如:> cc -g hello.c -o hello> g++ -g hello.cpp -o hello如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。

当你用-g把调试信息加入之后,并成功编译目标代码以后,让我们来看看如何用gdb来调试他。

启动GDB的方法有以下几种:1、gdb <program>program也就是你的执行文件,一般在当然目录下。

2、gdb <program> core用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。

3、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命令来查看,如下所示:/home/hchen> 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) 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" followed by command name for full documentation.Command name abbreviations are allowed if unambiguous.(gdb)gdb的命令很多,gdb把之分成许多个种类。

相关文档
最新文档