GDB 命令详解.docx
- 文档编号:24275928
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:36
- 大小:38.53KB
GDB 命令详解.docx
《GDB 命令详解.docx》由会员分享,可在线阅读,更多相关《GDB 命令详解.docx(36页珍藏版)》请在冰豆网上搜索。
GDB命令详解
GDB命令详细解释
Linux中包含有一个很有用的调试工具--gdb(GNUDebuger),它可以用来调试C和C++程序,功能不亚于Windows下的许多图形界面的调试工具。
和所有常用的调试工具一样,gdb提供了以下功能:
#监视程序中变量的值
#在程序中设置断点
#程序的单步执行
在使用gdb前,必须先载入可执行文件,因为要进行调试,文件中就必须包含调试信息,所以在用gcc或cc编译时就需要用-g参数来打开程序的调试选项。
调试开始时,必须先载入要进行调试的程序,可以用以下两种方式:
*在启动gdb后执行以下命令:
file可执行文件路径
*在gdb启动时就载入程序:
gdb可执行文件路径
载入程序后,接下来就是要进行断点的设置,要监视的变量的添加等工作,下面对在这个过程中常会用到的命令逐一进行介绍:
*list:
显示程序中的代码,常用使用格式有:
list
输出从上次调用list命令开始往后的10行程序代码。
list-
输出从上次调用list命令开始往前的10行程序代码。
listn
输出第n行附近的10行程序代码。
listfunction
输出函数function前后的10行程序代码。
*forward/search:
从当前行向后查找匹配某个字符串的程序行。
使用格式:
forward/search字符串
查找到的行号将保存在$_变量中,可以用print$_命令来查看。
*reverse-search:
和forward/search相反,向前查找字符串。
使用格式同上。
*break:
在程序中设置断点,当程序运行到指定行上时,会暂停执行。
使用格式:
break要设置断点的行号
*tbreak:
设置临时断点,在设置之后只起作用一次。
使用格式:
tbreak要设置临时断点的行号
*clear:
和break相反,clear用于清除断点。
使用格式:
clear要清除的断点所在的行号
*run:
启动程序,在run后面带上参数可以传递给正在调试的程序。
*awatch:
用来增加一个观察点(addwatch),使用格式:
awatch变量或表达式
当表达式的值发生改变或表达式的值被读取时,程序就会停止运行。
*watch:
与awatch类似用来设置观察点,但程序只有当表达式的值发生改变时才会停止运行。
使用格式:
watch变量或表达式
需要注意的是,awatch和watch都必须在程序运行的过程中设置观察点,即可运行run之后才能设置。
*commands:
设置在遇到断点后执行特定的指令。
使用格式有:
commands
设置遇到最后一个遇到的断点时要执行的命令
commandsn
设置遇到断点号n时要执行的命令
注意,commands后面跟的是断点号,而不是断点所在的行号。
在输入命令后,就可以输入遇到断点后要执行的命令,每行一条命令,在输入最后一条命令后输入end就可以结束输入。
*delete:
清除断点或自动显示的表达式。
使用格式:
delete断点号
*disable:
让指定断点失效。
使用格式:
disable断点号列表
断点号之间用空格间隔开。
*enable:
和disable相反,恢复失效的断点。
使用格式:
enable断点编号列表
*ignore:
忽略断点。
使用格式:
ignore断点号忽略次数
*condition:
设置断点在一定条件下才能生效。
使用格式:
condition断点号条件表达式
*cont/continue:
使程序在暂停在断点之后继续运行。
使用格式:
cont
跳过当前断点继续运行。
contn
跳过n次断点,继续运行。
当n为1时,cont1即为cont。
*jump:
让程序跳到指定行开始调试。
使用格式:
jump行号
*next:
继续执行语句,但是跳过子程序的调用。
使用格式:
执行一条语句
nextn
执行n条语句
*nexti:
单步执行语句,但和next不同的是,它会跟踪到子程序的内部,但不打印出子程序内部的语句。
使用格式同上。
*step:
与next类似,但是它会跟踪到子程序的内部,而且会显示子程序内部的执行情况。
使用格式同上。
*stepi:
与step类似,但是比step更详细,是nexti和step的结合。
使用格式同上。
*whatis:
显示某个变量或表达式的数据类型。
使用格式:
whatis变量或表达式
*ptype:
和whatis类似,用于显示数据类型,但是它还可以显示typedef定义的类型等。
使用格式:
ptype变量或表达式
*set:
设置程序中变量的值。
使用格式:
set变量=表达式
set变量:
=表达式
*display:
增加要显示值的表达式。
使用格式:
display表达式
*infodisplay:
显示当前所有的要显示值的表达式。
*deletedisplay/undisplay:
删除要显示值的表达式。
使用格式:
deletedisplay/undisplay表达式编号
*disabledisplay:
暂时不显示一个要表达式的值。
使用格式:
disabledisplay表达式编号
*enabledisplay:
与disabledisplay相反,使用表达式恢复显示。
使用格式:
enabledisplay表达式编号
*print:
打印变量或表达式的值。
使用格式:
print变量或表达式
表达式中有两个符号有特殊含义:
$和$$。
$表示给定序号的前一个序号,$$表示给定序号的前两个序号。
如果$和$$后面不带数字,则给定序号为当前序号。
*backtrace:
打印指定个数的栈帧(stackframe)。
使用格式:
backtrace栈帧个数
*frame:
打印栈帧。
使用格式:
frame栈帧号
*infoframe:
显示当前栈帧的详细信息。
*select-frame:
选择栈帧,选择后可以用infoframe来显示栈帧信息。
使用格式:
select-frame栈帧号
*kill:
结束当前程序的调试。
*quit:
退出gdb。
如要查看所有的gdb命令,可以在gdb下键入两次Tab(制表符),运行“helpcommand”可以查看命令command的详细使用格式。
---------------------------------------------------------------------
一个调试示例
——————
源程序:
tst.c
1#include
2
3intfunc(intn)
4{
5 intsum=0,i;
6 for(i=0;i 7 { 8 sum+=i; 9 } 10 returnsum; 11} 12 13 14main() 15{ 16 inti; 17 longresult=0; 18 for(i=1;i<=100;i++) 19 { 20 result+=i; 21 } 22 23 printf("result[1-100]=%d\n",result); 24 printf("result[1-250]=%d\n",func(250)); 25} 编译生成执行文件: (Linux下) hchen/test>cc-gtst.c-otst 使用GDB调试: hchen/test>gdbtst<----------启动GDB GNUgdb5.1.1 Copyright2002FreeSoftwareFoundation,Inc. GDBisfreesoftware,coveredbytheGNUGeneralPublicLicense,andyouare welcometochangeitand/ordistributecopiesofitundercertainconditions. Type"showcopying"toseetheconditions. ThereisabsolutelynowarrantyforGDB.Type"showwarranty"fordetails. ThisGDBwasconfiguredas"i386-suse-linux"... (gdb)l <--------------------l命令相当于list,从第一行开始例出原码。 1 #include 2 3 intfunc(intn) 4 { 5 intsum=0,i; 6 for(i=0;i 7 { 8 sum+=i; 9 } 10 returnsum; (gdb) <--------------------直接回车表示,重复上一次命令 11 } 12 13 14 main() 15 { 16 inti; 17 longresult=0; 18 for(i=1;i<=100;i++) 19 { 20 result+=i; (gdb)break16 <--------------------设置断点,在源程序第16行处。 Breakpoint1at0x8048496: filetst.c,line16. (gdb)breakfunc<--------------------设置断点,在函数func()入口处。 Breakpoint2at0x8048456: filetst.c,line5. (gdb)infobreak<--------------------查看断点信息。 NumType DispEnbAddress What 1 breakpoint keepy 0x08048496inmainattst.c: 16 2 breakpoint keepy 0x08048456infuncattst.c: 5 (gdb)r <---------------------运行程序,run命令简写 Startingprogram: /home/hchen/test/tst Breakpoint1,main()attst.c: 17 <----------在断点处停住。 17 longresult=0; (gdb)n <---------------------单条语句执行,next命令简写。 18 for(i=1;i<=100;i++) (gdb)n 20 result+=i; (gdb)n 18 for(i=1;i<=100;i++) (gdb)n 20 result+=i; (gdb)c <---------------------继续运行程序,continue命令简写。 Continuing. result[1-100]=5050 <----------程序输出。 Breakpoint2,func(n=250)attst.c: 5 5 intsum=0,i; (gdb)n 6 for(i=1;i<=n;i++) (gdb)pi <---------------------打印变量i的值,print命令简写。 $1=134513808 (gdb)n 8 sum+=i; (gdb)n 6 for(i=1;i<=n;i++) (gdb)psum $2=1 (gdb)n 8 sum+=i; (gdb)pi $3=2 (gdb)n 6 for(i=1;i<=n;i++) (gdb)psum $4=3 (gdb)bt <---------------------查看函数堆栈。 #0func(n=250)attst.c: 5 #10x080484e4inmain()attst.c: 24 #20x400409edin__libc_start_main()from/lib/libc.so.6 (gdb)finish <---------------------退出函数。 Runtillexitfrom#0func(n=250)attst.c: 5 0x080484e4inmain()attst.c: 24 24 printf("result[1-250]=%d\n",func(250)); Valuereturnedis$6=31375 (gdb)c <---------------------继续运行。 Continuing. result[1-250]=31375 <----------程序输出。 Programexitedwithcode027.<--------程序退出,调试结束。 (gdb)q <---------------------退出gdb。 hchen/test> 好了,有了以上的感性认识,还是让我们来系统地认识一下gdb吧。 使用GDB ———— 一般来说GDB主要调试的是C/C++的程序。 要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。 使用编译器(cc/gcc/g++)的-g参数可以做到这一点。 如: >cc-ghello.c-ohello >g++-ghello.cpp-ohello 如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。 当你用-g把调试信息加入之后,并成功编译目标代码以后,让我们来看看如何用gdb来调试他。 启动GDB的方法有以下几种: 1、gdb program也就是你的执行文件,一般在当然目录下。 2、gdb 用gdb同时调试一个运行程序和core文件,core是程序非法执行后coredump后产生的文件。 3、gdb 如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。 gdb会自动attach上去,并调试他。 program应该在PATH环境变量中搜索得到。 GDB启动时,可以加上一些GDB的启动开关,详细的开关可以用gdb-help查看。 我在下面只例举一些比较常用的参数: -symbols -s 从指定文件中读取符号表。 -sefile 从指定文件中读取符号表信息,并把他用在可执行文件中。 -core -c 调试时coredump的core文件。 -directory -d 加入一个源文件的搜索路径。 默认搜索路径是环境变量中PATH所定义的路径。 GDB的命令概貌 ——————— 启动gdb后,就你被带入gdb的调试环境中,就可以使用gdb的命令开始调试程序了,gdb的命令可以使用help命令来查看,如下所示: /home/hchen>gdb GNUgdb5.1.1 Copyright2002FreeSoftwareFoundation,Inc. GDBisfreesoftware,coveredbytheGNUGeneralPublicLicense,andyouare welcometochangeitand/ordistributecopiesofitundercertainconditions. Type"showcopying"toseetheconditions. ThereisabsolutelynowarrantyforGDB.Type"showwarranty"fordetails. ThisGDBwasconfiguredas"i386-suse-linux". (gdb)help Listofclassesofcommands: aliases--Aliasesofothercommands breakpoints--Makingprogramstopatcertainpoints data--Examiningdata files--Specifyingandexaminingfiles internals--Maintenancecommands obscure--Obscurefeatures running--Runningtheprogram stack--Examiningthestack status--Statusinquiries support--Supportfacilities tracepoints--Tracingofprogramexecutionwithoutstoppingtheprogram user-defined--User-definedcommands Type"help"followedbyaclassnameforalistofcommandsinthatclass. Type"help"followedbycommandnameforfulldocumentation. Commandnameabbreviationsareallowedifunambiguous. (gdb) gdb的命令很多,gdb把之分成许多个种类。 help命令只是例出gdb的命令种类,如果要看种类中的命令,可以使用help helpbreakpoints,查看设置断点的所有命令。 也可以直接help gdb中,输入命令时,可以不用打全命令,只用打命令的前几个字符就可以了,当然,命令的前几个字符应该要标志着一个唯一的命令,在Linux下,你可以敲击两次TAB键来补齐命令的全称,如果有重复的,那么gdb会把其例出来。 示例一: 在进入函数func时,设置一个断点。 可以敲入breakfunc,或是直接就是bfunc (gdb)bfunc Breakpoint1at0x8048458: filehello.c,line10. 示例二: 敲入b按两次TAB键,你会看到所有b打头的命令: (gdb)b backtracebreak bt (gdb) 示例三: 只记得函数的前缀,可以这样: (gdb)bmake_<按TAB键> (再按下一次TAB键,你会看到: ) make_a_section_from_file make_environ make_abs_section make_function_type make_blockvector make_pointer_type make_cleanup make_reference_type make_command make_symbol_completion_list (gdb)bmake_ GDB把所有make开头的函数全部例出
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- GDB 命令详解 命令 详解