GDB调试及实例
实例—使用gdb调试器

2.4 实例—使用gdb调试器1.编写实例程序gcctest.c,见2.2小节的开头部分2.编译3.启动GDB,执行程序启动gdb,进入gdb调试环境,可以使用gdb的命令对程序进行调试。
[root@localhost gdbtest txt]# gdb //启动gdbGNU gdb Fedora (6.8-27.el5)Copyright (C) 2008 Free Software Foundation, Inc.License GPLv3+: GNU GPL version 3 or 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 "i386-redhat-linux-gnu".(gdb) run gcctest //在gdb中,运行程序使用r或是run命令,注意,gcctest没有调试信息Starting program: gcctestNo executable file specified.Use the "file" or "exec-file" command. //要使用file或exec-file命令指出要运行的程序(gdb) file gcctest //使用file命令指出要运行的程序gcctest,注意,对gdb命令也可以使用Tab gcctest gcctest.c gcctestg(gdb) file gcctest //使用file命令指出要运行的程序gcctestReading symbols from /root/Desktop/gdbtest txt/gcctest...(no debugging symbols found)...done.(gdb) r //在gdb中,运行程序使用r或是run命令Starting program: /root/Desktop/gdbtest txt/gcctest gcctest(no debugging symbols found)(no debugging symbols found)(no debugging symbols found)hello in mainhello 1hello 2sum=54125560035401396161080590579269632.000000Program exited with code 057.(gdb) file gcctestg //使用file命令指出要运行的程序gcctestgReading symbols from /root/Desktop/gdbtest txt/gcctestg...done.(gdb) r //在gdb中,运行程序使用r或是run命令Starting program: /root/Desktop/gdbtest txt/gcctestg gcctesthello in mainhello 1hello 2sum=54125560035401396161080590579269632.000000Program exited with code 057.(gdb) q //使用q或是quit命令退出gdb[root@localhost gdbtest txt]#4.GDB命令简介support -- 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) help files //使用help <class>命令查看files类中的命令Specifying and examining files.List of commands:add-shared-symbol-files -- Load the symbols from shared objects in the dynamic linker's link mapadd-symbol-file -- Load symbols from FILEadd-symbol-file-from-memory -- Load the symbols out of memory from a dynamically loaded object filecd -- Set working directory to DIR for debugger and program being debuggedcore-file -- Use FILE as core dump for examining memory and registersdirectory -- Add directory DIR to beginning of search path for source filesedit -- Edit specified file or functionexec-file -- Use FILE as program for getting contents of pure memoryfile -- Use FILE as program to be debuggedforward-search -- Search for regular expression (see regex(3)) from last line listedgenerate-core-file -- Save a core file with the current state of the debugged processlist -- List specified function or lineload -- Dynamically load FILE into the running programnosharedlibrary -- Unload all shared object library symbolspath -- Add directory DIR(s) to beginning of search path for object filespwd -- Print working directoryremote -- Manipulate files on the remote systemremote delete -- Delete a remote fileremote get -- Copy a remote file to the local systemremote put -- Copy a local file to the remote system---Type <return> to continue, or q <return> to quit--- //一屏显示不完,敲回车键显示后面的内容reverse-search -- Search backward for regular expression (see regex(3)) from last line listedsearch -- Search for regular expression (see regex(3)) from last line listedsection -- Change the base address of section SECTION of the exec file to ADDRsharedlibrary -- Load shared object library symbols for files matching REGEXPsymbol-file -- Load symbol table from executable file FILEType "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)5.显示源代码(gdb) file gcctestg //使用file命令指出要运行的程序gcctestgLoad new symbol table from "/root/Desktop/gdbtest txt/gcctestg"? (y or n) yReading symbols from /root/Desktop/gdbtest txt/gcctestg...done.(gdb) list //显示当前行后面的源程序1 #include <stdio.h>23 void print_hello1(char *p_str);4 void print_hello2(char *p_str);56 int main(int argc,char **argv)7 {8 double i,sum=0;9 char *pstr="hello in main";10 int arr[]={1,2,3,4,5};(gdb) list //显示当前行后面的源程序11 printf("%s\n",pstr);12 print_hello1("hello 1");13 print_hello2("hello 2");1415 for(i=1; i<=1020000020.01*1020000020.01*10100020.01*10100020.00202; i=i*1.0000016)16 sum=sum/1.0201809902203*1.000102101203*1.00006605+i*10.01016/1.0005;17 printf("sum=%f\n",sum);18 }1920 void print_hello1(char *p_str)(gdb) //敲回车键,继续执行list命令,显示当前行后面的源程序21 {22 printf("%s\n",p_str);23 }2425 void print_hello2(char *p_str)26 {27 printf("%s\n",p_str);28 }(gdb) list 8 //显示程序第8行的周围的源程序3 void print_hello1(char *p_str);4 void print_hello2(char *p_str);56 int main(int argc,char **argv)7 {8 double i,sum=0;9 char *pstr="hello in main";10 int arr[]={1,2,3,4,5};11 printf("%s\n",pstr);12 print_hello1("hello 1");(gdb) list 6,10 //显示程序第6-10行的源程序6 int main(int argc,char **argv)7 {8 double i,sum=0;9 char *pstr="hello in main";10 int arr[]={1,2,3,4,5};(gdb)gdb可以显示调试程序(编译程序时一定要加上-g参数,把源程序信息编译到执行文件中)的源代码。
gdb交叉编译调试教程

gdb交叉编译调试教程1.引言1.1 概述引言是一篇长文的开头部分,用于向读者介绍文章的背景、内容和目的。
在本篇长文中,我们介绍了gdb交叉编译调试的教程。
在本文的概述部分,我们将对文章的主要内容进行简要介绍。
本文主要分为引言、正文和结论三个部分。
在引言部分,我们首先介绍了本文的概述。
随后,我们会详细说明文章的结构和目的。
本文的主要目的是教会读者如何使用gdb进行交叉编译调试。
我们将从gdb的简介开始,介绍gdb的基本功能和用途。
然后,我们会对交叉编译进行概述,详细说明交叉编译的原理和常见的应用场景。
在结论部分,我们将对本文进行总结,并提供一些建议,帮助读者更好地进行实践。
通过本文的学习,读者将能够掌握gdb交叉编译调试的基本技巧,为软件开发和调试提供便利。
同时,读者也能够理解交叉编译的原理和应用,进一步提高自己的编程能力。
接下来,让我们开始正文的内容,详细介绍gdb的相关知识和交叉编译的实践操作。
文章结构部分的内容可以包括以下内容:文章结构指导读者对整篇文章的组织和内容有一个清晰的了解。
通过明确的结构,读者可以更好地理解和学习文章中的知识点。
下面是文章结构的主要部分:1.2 文章结构本文分为引言、正文和结论三个部分。
引言部分(Introduction)主要介绍了本文的背景和目的。
其中,概述部分介绍了本文要讲解的主题:gdb交叉编译调试。
通过引言部分,读者可以了解到本文所涉及的领域和问题,并对后续内容有一个整体的了解。
正文部分(Main Body)是本文的主要内容,分为多个小节。
第一个小节(2.1 GDB简介)介绍了GDB的基本概念和功能,包括它是什么、为什么要使用它以及如何使用它进行调试等。
通过这一小节,读者可以快速了解GDB的基本知识。
第二个小节(2.2 交叉编译概述)介绍了交叉编译的基本概念和原理。
解释了为什么需要进行交叉编译以及如何进行交叉编译。
此小节还可以涵盖一些常见的交叉编译工具和方法,以帮助读者更好地理解交叉编译的过程和技术。
GDB100技术暨使用说明书

GDB100技术暨使用说明书前言GDB100是一款高性能的调试器,适用于各种嵌入式系统、服务器以及桌面程序的调试。
本说明书将详细介绍GDB100的功能、用法以及注意事项,帮助用户快速掌握该调试器的使用方法。
功能介绍全面的调试功能GDB100支持各种调试功能,包括断点调试、单步调试、变量监视、函数调用跟踪等。
用户可以根据需要随时打开或关闭这些功能。
多种调试接口GDB100可通过多种接口与被调试程序通信,支持串口、网络、JTAG等多种通信方式,用户可以根据不同的需求选择合适的接口进行调试。
多种编程语言支持GDB100支持多种编程语言,包括C、C++、Python等,用户可以根据自己的项目需求选择合适的编程语言进行开发和调试。
跨平台支持GDB100可以在Linux、Windows、macOS等多个操作系统上运行,保证了用户在不同平台上使用调试器的便捷性和稳定性。
安装GDB100用户可以从GDB100的官方网站上下载安装包,根据提示进行安装。
安装完成后,用户需要将GDB100添加到环境变量中,以便在命令行中使用。
连接被调试程序串口连接如果需要通过串口连接被调试程序,用户需要先确定串口的连接参数,包括串口号、波特率、数据位等。
然后,在命令行中输入如下命令:gdb -ex 'target remote /dev/ttyS0' program.elf其中,/dev/ttyS0为串口号,program.elf为被调试程序的可执行文件。
网络连接如果需要通过网络连接被调试程序,用户需要先确定被调试程序的IP地址和端口号,然后在命令行中输入如下命令:gdb -ex 'target remote IP:port' program.elf其中,IP为被调试程序的IP地址,port为端口号,program.elf 为被调试程序的可执行文件。
如果需要通过JTAG连接被调试程序,用户需要先确定JTAG连接的接口类型和连接参数,然后在命令行中输入如下命令:gdb -ex 'target remote :port' -ex 'monitor jtag_devic e_type connection_arguments' program.elf其中,port为JTAG连接的端口号,jtag_device_type为JTAG 设备类型,connection_arguments为连接参数,program.elf为被调试程序的可执行文件。
gdb调试技巧

gdb调试技巧GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。
它是一种强大的命令行调试工具。
一般来说,调试器的功能:能够运行程序,设置所有能影响程序运行的参数;能够让程序在指定条件下停止运行;能够在程序停止时检查所有参数的情况;能够根据指定条件改变程序的运行。
gdb调试源代码流程:1)进入GDB #gdb test只需输入GDB和要调试的可执行文件即可,在GDB的启动画面中指出了GDB的版本号、遵循的许可等信息,接下来就进入了由"(gdb)"开头的命令行界面了;2)查看文件(gdb) l在GDB中键入"l"(list)就可以查看程序的源码了,GDB列出的源代码中明确地给出了对应的行号,方便代码的定位;3)设置断点(gdb) b 6只需在"b"(break)后加入对应的行号即可,在GDB中利用行号设置断点是指代码运行到对应行之前暂停;设置断点可以使程序执行到某个位置时暂停,程序员在该位置处可以方便地查看变量的值、堆栈情况等;一般情况下,源代码中大家行号与用户书写程序的行号是一致的,但有时由于用户的某些编译选项会导致行号不一致的情况,因此,一定要查看在GDB中的行号;4)查看断点处情况(gdb) info b可以键入"info b"来查看断点处情况,可以设置多个断点;5)运行代码(gdb) rGDB默认从首行开始运行代码,键入"r"(run)即可;程序运行到断点处停止。
6)看变量值(gdb) p n在程序暂停之后,程序员可以查看断点处的相关变量值,在GDB 中只需键入"p 变量名"(print)即可;GDB在显示变量值时都会在对应值之前加上"$N"标记,它是当前变量值的引用标记,以后若想再次引用此变量,就可以直接写作"$N",而无需写冗长的变量名;7)观察变量(gdb) watch n在某一循环处,往往希望能够观察一个变量的变化情况,这时就可以键入命令"watch"来观察变量的变化情况,GDB在"n"设置了观察点;8)单步运行(gdb) n单步运行是指一次只运行一条语句,这样可以方便查看程序运行的结果,在此处只需键入"n"(next)即可;随着程序的单步运行,当变量n的值发生变化时,GDB就会自动显示出n的变化情况。
多进程 多线程调试方法 GDB调试 .

[root@tivf09 root]# ps -ef|grep -i vnc
root 19609 1 0 Jun05 ?
00:08:46 Xvnc :1 -desktop
tivf09:1 (root)
-httpd /usr/share/vnc/classes -auth /root/.Xauthority
-geometry 1024x768
-depth 16 -rfbwait 30000 -rfbauth /root/.vnc/passwd -rfbport
5901 -pn
root 19627 1 0 Jun05 ?
00:00:00 vncconfig
-iconic
root 12714 10599 0 01:23 pts/0 00:00:00 grep -i vnc
Attach 子进程
众所周知,GDB 有附着(attach)到正在运行的进程的功能,即 attach <pid>命令。因此我们可以利用该命令 attach 到子进程然后进行调试。
例如我们要调试某个进程 RIM_Oracle_Agent.9i,首先得到该进程的 pid
[root@tivf09 tianq]# ps -ef|grep RIM_Oracle_Agent.9i
3、GDB wrapper 方法:专用于 fork+exec 模式,不用添加额外代码, 但需要 X 环境支持(xterm/VNC)这种方式没有使用过,一般对于企业 开发的话是不是很多都没有 x 环境支持的吧(猜测:))
follow-fork-mode 方式比较简单,通过 set follow-fork-mode child | parent 来觉得跟踪 child 还是 parent,然后可以设置断点跟踪了
gdb调试案例

gdb调试案例以GDB调试案例为题,我将列举以下10个案例,每个案例将描述GDB的使用场景、调试目标、具体步骤和调试结果,以帮助读者更好地理解和掌握GDB调试工具。
案例一:查看程序崩溃的原因场景:当程序崩溃时,我们需要找出崩溃的原因,以便修复程序中的bug。
目标:在程序崩溃时,使用GDB查看崩溃的原因。
步骤:1. 使用-g选项编译程序,以包含调试信息。
2. 执行gdb命令,加载可执行文件。
3. 在GDB中运行程序,当程序崩溃时,GDB会自动停止程序的执行。
4. 使用backtrace命令查看调用栈,找出导致崩溃的函数和行号。
5. 使用print命令查看变量的值,以便进一步分析崩溃原因。
结果:通过查看调用栈和变量的值,我们可以定位到导致程序崩溃的具体代码行,并进行修复。
案例二:设置断点并跟踪程序执行场景:当程序运行过程中出现问题,我们需要跟踪程序的执行过程,以便找出问题所在。
目标:使用GDB设置断点并跟踪程序执行。
步骤:1. 使用-g选项编译程序,以包含调试信息。
2. 执行gdb命令,加载可执行文件。
3. 使用break命令设置断点,可以选择在特定函数或行号上设置断点。
4. 运行程序,GDB会在断点处停止程序的执行。
5. 使用step命令逐行执行程序,并查看变量的值。
6. 使用continue命令继续程序的执行,直到下一个断点或程序结束。
结果:通过设置断点和逐行执行程序,我们可以跟踪程序的执行过程,找出问题所在。
案例三:查看内存信息场景:当程序出现内存相关的问题时,我们需要查看程序的内存使用情况,以便分析问题所在。
目标:使用GDB查看程序的内存信息。
步骤:1. 使用-g选项编译程序,以包含调试信息。
2. 执行gdb命令,加载可执行文件。
3. 运行程序,GDB会自动停止程序的执行。
4. 使用info breakpoints命令查看已设置的断点。
5. 使用info registers命令查看寄存器的值。
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的使用和功能。
经典的GDB调试命令,包括查看变量,查看内存

经典的GDB调试命令,包括查看变量,查看内存经典的GDB调试命令,包括查看变量,查看内存在你调试程序时,当程序被停住时,你可以使⽤print命令(简写命令为p),或是同义命令inspect来查看当前程序的运⾏数据。
print命令的格式是:printprint /是表达式,是你所调试的程序的语⾔的表达式(GDB可以调试多种编程语⾔),是输出的格式,⽐如,如果要把表达式按16进制的格式输出,那么就是/x。
⼀、表达式print和许多GDB的命令⼀样,可以接受⼀个表达式,GDB会根据当前的程序运⾏的数据来计算这个表达式,既然是表达式,那么就可以是当前程序运⾏中的const常量、变量、函数等内容。
可惜的是GDB不能使⽤你在程序中所定义的宏。
表达式的语法应该是当前所调试的语⾔的语法,由于C/C++是⼀种⼤众型的语⾔,所以,本⽂中的例⼦都是关于C/C++的。
(⽽关于⽤GDB 调试其它语⾔的章节,我将在后⾯介绍)在表达式中,有⼏种GDB所⽀持的操作符,它们可以⽤在任何⼀种语⾔中。
@是⼀个和数组有关的操作符,在后⾯会有更详细的说明。
::指定⼀个在⽂件或是⼀个函数中的变量。
{}表⽰⼀个指向内存地址的类型为type的⼀个对象。
⼆、程序变量在GDB中,你可以随时查看以下三种变量的值:1. 全局变量(所有⽂件可见的)2. 静态全局变量(当前⽂件可见的)3. 局部变量(当前Scope可见的)如果你的局部变量和全局变量发⽣冲突(也就是重名),⼀般情况下是局部变量会隐藏全局变量,也就是说,如果⼀个全局变量和⼀个函数中的局部变量同名时,如果当前停⽌点在函数中,⽤print显⽰出的变量的值会是函数中的局部变量的值。
如果此时你想查看全局变量的值时,你可以使⽤::操作符:file::variablefunction::variable可以通过这种形式指定你所想查看的变量,是哪个⽂件中的或是哪个函数中的。
例如,查看⽂件f2.c中的全局变量x的值:gdb) p 'f2.c'::x当然,::操作符会和C++中的发⽣冲突,GDB能⾃动识别::是否C++的操作符,所以你不必担⼼在调试C++程序时会出现异常。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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 使程序恰好在执行给定行之前停止。
l break function-name 使程序恰好在进入指定的函数之前停止。
l break line-or-function if condition 如果condition(条件)是真,程序到达指定行或函数时停止。
l break routine-name 在指定例程的入口处设置断点如果该程序是由很多原文件构成的,你可以在各个原文件中设置断点,而不是在当前的原文件中设置断点,其方法如下:(gdb) break filename:line-number(gdb) break filename:function-name要想设置一个条件断点,可以利用break if命令,如下所示:(gdb) break line-or-function if expr例:(gdb) break 46 if testsize==100从断点继续运行:countinue 命令五.断点的管理1.显示当前gdb的断点信息:(gdb) info break他会以如下的形式显示所有的断点信息:Num Type Disp Enb Address What1 breakpoint keep y 0x000028bc in init_random at qsort2.c:1552 breakpoint keep y 0x0000291c in init_organ at qsort2.c:168(gdb)2.删除指定的某个断点:(gdb) delete breakpoint 1该命令将会删除编号为1的断点,如果不带编号参数,将删除所有的断点(gdb) delete breakpoint3.禁止使用某个断点(gdb) disable breakpoint 1该命令将禁止断点1,同时断点信息的(Enb)域将变为n4.允许使用某个断点(gdb) enable breakpoint 1该命令将允许断点1,同时断点信息的(Enb)域将变为y5.清除原文件中某一代码行上的所有断点(gdb)clean number注:number 为原文件的某个代码行的行号六.变量的检查和赋值l whatis:识别数组或变量的类型l ptype:比whatis的功能更强,他可以提供一个结构的定义l set variable:将值赋予变量l print 除了显示一个变量的值外,还可以用来赋值七.单步执行l next不进入的单步执行l step进入的单步执行如果已经进入了某函数,而想退出该函数返回到它的调用函数中,可使用命令finish 八.函数的调用l call name 调用和执行一个函数(gdb) call gen_and_sork( 1234,1,0 )(gdb) call printf(“abcd”)$1=4l finish 结束执行当前函数,显示其返回值(如果有的话)九.机器语言工具有一组专用的gdb变量可以用来检查和修改计算机的通用寄存器,gdb提供了目前每一台计算机中实际使用的4个寄存器的标准名字:l $pc :程序计数器l $fp :帧指针(当前堆栈帧)l $sp :栈指针l $ps :处理器状态十.信号gdb通常可以捕捉到发送给它的大多数信号,通过捕捉信号,它就可决定对于正在运行的进程要做些什么工作。
例如,按CTRL-C将中断信号发送给gdb,通常就会终止gdb。
但是你或许不想中断gdb,真正的目的是要中断gdb正在运行的程序,因此,gdb要抓住该信号并停止它正在运行的程序,这样就可以执行某些调试操作。
Handle命令可控制信号的处理,他有两个参数,一个是信号名,另一个是接受到信号时该作什么。
几种可能的参数是:l nostop 接收到信号时,不要将它发送给程序,也不要停止程序。
l stop 接受到信号时停止程序的执行,从而允许程序调试;显示一条表示已接受到信号的消息(禁止使用消息除外)l print 接受到信号时显示一条消息l noprint 接受到信号时不要显示消息(而且隐含着不停止程序运行)l pass 将信号发送给程序,从而允许你的程序去处理它、停止运行或采取别的动作。
l nopass 停止程序运行,但不要将信号发送给程序。
例如,假定你截获SIGPIPE信号,以防止正在调试的程序接受到该信号,而且只要该信号一到达,就要求该程序停止,并通知你。
要完成这一任务,可利用如下命令:(gdb) handle SIGPIPE stop print请注意,UNIX的信号名总是采用大写字母!你可以用信号编号替代信号名如果你的程序要执行任何信号处理操作,就需要能够测试其信号处理程序,为此,就需要一种能将信号发送给程序的简便方法,这就是signal命令的任务。
该命令的参数是一个数字或者一个名字,如SIGINT。
假定你的程序已将一个专用的SIGINT(键盘输入,或CTRL-C;信号2)信号处理程序设置成采取某个清理动作,要想测试该信号处理程序,你可以设置一个断点并使用如下命令:(gdb)signal 2continuing with signal SIGINT(2)该程序继续执行,但是立即传输该信号,而且处理程序开始运行.十一. 原文件的搜索search text:该命令可显示在当前文件中包含text串的下一行。
Reverse-search text:该命令可以显示包含text 的前一行。
十二.UNIX接口shell 命令可启动UNIX外壳,CTRL-D退出外壳,返回到gdb.十三.命令的历史为了允许使用历史命令,可使用set history expansion on 命令(gdb) set history expansion on小结:常用的gdb命令backtrace 显示程序中的当前位置和表示如何到达当前位置的栈跟踪(同义词:where)breakpoint 在程序中设置一个断点cd 改变当前工作目录clear 删除刚才停止处的断点commands 命中断点时,列出将要执行的命令continue 从断点开始继续执行delete 删除一个断点或监测点;也可与其他命令一起使用display 程序停止时显示变量和表达时down 下移栈帧,使得另一个函数成为当前函数frame 选择下一条continue命令的帧info 显示与该程序有关的各种信息jump 在源程序中的另一点开始运行kill 异常终止在gdb 控制下运行的程序list 列出相应于正在执行的程序的原文件内容next 执行下一个源程序行,从而执行其整体中的一个函数print 显示变量或表达式的值pwd 显示当前工作目录pype 显示一个数据结构(如一个结构或C++类)的内容quit 退出gdbreverse-search 在源文件中反向搜索正规表达式run 执行该程序search 在源文件中搜索正规表达式set variable 给变量赋值signal 将一个信号发送到正在运行的进程step 执行下一个源程序行,必要时进入下一个函数undisplay display命令的反命令,不要显示表达式until 结束当前循环up 上移栈帧,使另一函数成为当前函数watch 在程序中设置一个监测点(即数据断点)whatis 显示变量或函数类型****************************************************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 后跟命令的分类名,可获得该类命令的详细清单。