gdblinux下的应用程序GDB调试方法Word文件下载.docx
《gdblinux下的应用程序GDB调试方法Word文件下载.docx》由会员分享,可在线阅读,更多相关《gdblinux下的应用程序GDB调试方法Word文件下载.docx(22页珍藏版)》请在冰点文库上搜索。
i++)
19{
20result+=i;
21}
22
23printf("
result[1-100]=%d"
result);
24printf("
result[1-250]=%d"
func(250));
25}
编译生成执行文件:
(Linux下)
hchen/test>
cc-gtst.c-otst
使用GDB调试:
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,从第一行开始例出原码。
i7{
(gdb)<
--------------------直接回车表示,重复上一次命令
(gdb)break16<
--------------------设置断点,在源程序第16行处。
Breakpoint1at0x8048496:
filetst.c,line16.
(gdb)breakfunc<
--------------------设置断点,在函数func()入口处。
Breakpoint2at0x8048456:
filetst.c,line5.
(gdb)infobreak<
--------------------查看断点信息。
NumTypeDispEnbAddressWhat
1breakpointkeepy0x08048496inmainattst.c:
16
2breakpointkeepy0x08048456infuncattst.c:
5
(gdb)r<
---------------------运行程序,run命令简写
Startingprogram:
/home/hchen/test/tst
Breakpoint1,main()attst.c:
17<
----------在断点处停住。
(gdb)n<
---------------------单条语句执行,next命令简写。
(gdb)n
(gdb)c<
---------------------继续运行程序,continue命令简写。
Continuing.
result[1-100]=5050<
----------程序输出。
Breakpoint2,func(n=250)attst.c:
6for(i=1;
=n;
(gdb)pi<
---------------------打印变量i的值,print命令简写。
$1=134513808
(gdb)psum
$2=1
(gdb)pi
$3=2
$4=3
(gdb)bt<
---------------------查看函数堆栈。
#0func(n=250)attst.c:
#10x080484e4inmain()attst.c:
24
#20x400409edin__libc_start_main()from/lib/libc.so.6
(gdb)finish<
---------------------退出函数。
Runtillexitfrom#0func(n=250)attst.c:
0x080484e4inmain()attst.c:
Valuereturnedis$6=31375
---------------------继续运行。
result[1-250]=31375<
Programexitedwithcode027.<
--------程序退出,调试结束。
(gdb)q<
---------------------退出gdb。
Gdb调试精粹
一:
列文件清单
1.
List
(gdb)listline1,line2
二:
执行程序
要想运行准备调试的程序,可使用run命令,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出说明符(<
和>
;
)和外壳通配符(*、?
、[、])在内。
如果你使用不带参数的run命令,gdb就再次使用你给予前一条run命令的参数,这是很有用的。
利用setargs命令就可以修改发送给程序的参数,而使用showargs命令就可以查看其缺省参数的列表。
(gdb)setargs–b–x
(gdb)showargs
backtrace命令为堆栈提供向后跟踪功能。
Backtrace命令产生一张列表,包含着从最近的过程开始的所以有效过程和调用这些过程的参数。
三:
显示数据
利用print命令可以检查各个变量的值。
(gdb)printp(p为变量名)
whatis命令可以显示某个变量的类型
(gdb)whatisp
type=int*
print是gdb的一个功能很强的命令,利用它可以显示被调试的语言中任何有效的表达式。
表达式除了包含你程序中的变量外,还可以包含以下内容:
l
对程序中函数的调用
(gdb)printfind_entry(1,0)
数据结构和其他复杂对象
(gdb)print*table_start
$8={e=reference=’\000’<
repeats79times>
location=0x0,next=0x0}
值的历史成分
(gdb)print$1($1为历史记录变量,在以后可以直接引用$1的值)
人为数组
人为数组提供了一种去显示存储器块(数组节或动态分配的存储区)内容的方法。
早期的调试程序没有很好的方法将任意的指针换成一个数组。
就像对待参数一样,让我们查看内存中在变量h后面的10个整数,一个动态数组的语法如下所示:
base@length
因此,要想显示在h后面的10个元素,可以使用h@10:
(gdb)printh@10
$13=(-1,345,23,-234,0,0,0,98,345,10)
四:
断点(breakpoint)
break命令(可以简写为b)可以用来在调试的程序中设置断点,该命令有如下四种形式:
breakline-number使程序恰好在执行给定行之前停止。
breakfunction-name使程序恰好在进入指定的函数之前停止。
breakline-or-functionifcondition如果condition(条件)是真,程序到达指定行或函数时停止。
breakroutine-name在指定例程的入口处设置断点
如果该程序是由很多原文件构成的,你可以在各个原文件中设置断点,而不是在当前的原文件中设置断点,其方法如下:
(gdb)breakfilename:
line-number
function-name
要想设置一个条件断点,可以利用breakif命令,如下所示:
(gdb)breakline-or-functionifexpr
例:
(gdb)break46iftestsize==100
从断点继续运行:
countinue命令
五.断点的管理
显示当前gdb的断点信息:
(gdb)infobreak
他会以如下的形式显示所有的断点信息:
Num
Type
Disp
Enb
Address
What
1
breakpoint
keep
y
0x000028bc
ininit_randomatqsort2.c:
155
2
0x0000291cininit_organ
atqsort2.c:
168
(gdb)
2.删除指定的某个断点:
(gdb)deletebreakpoint1
该命令将会删除编号为1的断点,如果不带编号参数,将删除所有的断点
(gdb)deletebreakpoint
3.禁止使用某个断点
(gdb)disablebreakpoint1
该命令将禁止断点1,同时断点信息的(Enb)域将变为
n
4.允许使用某个断点
(gdb)enablebreakpoint1
该命令将允许断点1,同时断点信息的(Enb)域将变为
y
5.清除原文件中某一代码行上的所有断点
(gdb)cleannumber
注:
number为原文件的某个代码行的行号
六.变量的检查和赋值
whatis:
识别数组或变量的类型
ptype:
比whatis的功能更强,他可以提供一个结构的定义
setvariable:
将值赋予变量
print除了显示一个变量的值外,还可以用来赋值
七.单步执行
next
不进入的单步执行
step
进入的单步执行
如果已经进入了某函数,而想退出该函数返回到它的调用函数中,可使用命令finish
八.函数的调用
callname调用和执行一个函数
(gdb)callgen_and_sork(1234,1,0)
(gdb)callprintf(“abcd”)
$1=4
finish结束执行当前函数,显示其返回值(如果有的话)
九.机器语言工具
有一组专用的gdb变量可以用来检查和修改计算机的通用寄存器,gdb提供了目前每一台计算机中实际使用的4个寄存器的标准名字:
$pc
:
程序计数器
$fp
帧指针(当前堆栈帧)
$sp
栈指针
$ps
处理器状态
十.信号
gdb通常可以捕捉到发送给它的大多数信号,通过捕捉信号,它就可决定对于正在运行的进程要做些什么工作。
例如,按CTRL-C将中断信号发送给gdb,通常就会终止gdb。
但是你或许不想中断gdb,真正的目的是要中断gdb正在运行的程序,因此,gdb要抓住该信号并停止它正在运行的程序,这样就可以执行某些调试操作。
Handle命令可控制信号的处理,他有两个参数,一个是信号名,另一个是接受到信号时该作什么。
几种可能的参数是:
nostop接收到信号时,不要将它发送给程序,也不要停止程序。
stop接受到信号时停止程序的执行,从而允许程序调试;
显示一条表示已接受到信号的消息(禁止使用消息除外)
print接受到信号时显示一条消息
noprint接受到信号时不要显示消息(而且隐含着不停止程序运行)
pass将信号发送给程序,从而允许你的程序去处理它、停止运行或采取别的动作。
nopass停止程序运行,但不要将信号发送给程序。
例如,假定你截获SIGPIPE信号,以防止正在调试的程序接受到该信号,而且只要该信号一到达,就要求该程序停止,并通知你。
要完成这一任务,可利用如下命令:
(gdb)handleSIGPIPEstopprint
请注意,UNIX的信号名总是采用大写字母!
你可以用信号编号替代信号名
如果你的程序要执行任何信号处理操作,就需要能够测试其信号处理程序,为此,就需要一种能将信号发送给程序的简便方法,这就是signal命令的任务。
该命令的参数是一个数字或者一个名字,如SIGINT。
假定你的程序已将一个专用的SIGINT(键盘输入,或CTRL-C;
信号2)信号处理程序设置成采取某个清理动作,要想测试该信号处理程序,你可以设置一个断点并使用如下命令:
(gdb)signal2
continuingwithsignalSIGINT
(2)
该程序继续执行,但是立即传输该信号,而且处理程序开始运行.
十一.原文件的搜索
searchtext:
该命令可显示在当前文件中包含text串的下一行。
Reverse-searchtext:
该命令可以显示包含text的前一行。
十二.UNIX接口
shell命令可启动UNIX外壳,CTRL-D退出外壳,返回到
gdb.
十三.命令的历史
为了允许使用历史命令,可使用sethistoryexpansionon
命令
(gdb)sethistoryexpansionon
小结:
常用的gdb命令
backtrace
显示程序中的当前位置和表示如何到达当前位置的栈跟踪(同义词:
where)
breakpoint
在程序中设置一个断点
cd
改变当前工作目录
clear
删除刚才停止处的断点
commands
命中断点时,列出将要执行的命令
continue
从断点开始继续执行
delete
删除一个断点或监测点;
也可与其他命令一起使用
display
程序停止时显示变量和表达时
down
下移栈帧,使得另一个函数成为当前函数
frame
选择下一条continue命令的帧
info
显示与该程序有关的各种信息
jump
在源程序中的另一点开始运行
kill
异常终止在gdb控制下运行的程序
list
列出相应于正在执行的程序的原文件内容
next
执行下一个源程序行,从而执行其整体中的一个函数
print
显示变量或表达式的值
pwd
显示当前工作目录
pype
显示一个数据结构(如一个结构或C++类)的内容
quit
退出gdb
reverse-search
在源文件中反向搜索正规表达式
run
执行该程序
search
在源文件中搜索正规表达式
setvariable
给变量赋值
signal
将一个信号发送到正在运行的进程
step
执行下一个源程序行,必要时进入下一个函数
undisplay
display命令的反命令,不要显示表达式
until
结束当前循环
up
上移栈帧,使另一函数成为当前函数
watch
在程序中设置一个监测点(即数据断点)
whatis
显示变量或函数类型
<
end>
Linux的大部分特色源自于shell的GNU调试器,也称作gdb。
gdb可以让您查看程
序的内部结构、打印变量值、设置断点,以及单步调试源代码。
它是功能极其强大的工
具,适用于修复程序代码中的问题。
在本文中,我将尝试说明gdb有多棒,多实用。
编译
开始调试之前,必须用程序中的调试信息编译要调试的程序。
这样,gdb才能够调试所
使用的变量、代码行和函数。
如果要进行编译,请在gcc(或g++)下使用额外的-g
选项来编译程序:
gcc-geg.c-oeg
运行gdb
在shell中,可以使用gdb命令并指定程序名作为参数来运行gdb,例如gdbeg;
或
者在gdb中,可以使用file命令来装入要调试的程序,例如fileeg。
这两种方式都
假设您是在包含程序的目录中执行命令。
装入程序之后,可以用gdb命令un来启动程
序。
调试会话示例
如果一切正常,程序将执行到结束,此时gdb将重新获得控制。
但如果有错误将会怎么
样?
这种情况下,gdb会获得控制并中断程序,从而可以让您检查所有事物的状态,如
果运气好的话,可以找出原因。
为了