版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、GDB 不完全手册巫山霏云msn:fWebSite:http:GDB 即 GNU Debuger,是 GNU 下的调试器.主要是用在 linux 下面。但是也有人把它移植到 Win32上面,这样常常在 Windows 下面的人也有机会接触到这个非常优秀的调试器。Free Pascal 一直都是调用 GDB 来调试程序,FP 2.0.2 版本中间的 GDB版本为 6.2.1。然而 Free Pascal 的IDE 在Windows 下面一直饱受不稳定的责难,因此很多人都不喜欢在 IDE 里面直接调试程序。但是做为调试器 GDB 还是非常优秀,但是很多人在直接面对命令行调试程序时非常不,更重要的是
2、不会使用 GDB 的指令.对此,我给出我在使用 GDB 时的心得,希望大家能够喜欢,从中受益。由于水平有限,时间仓促(一天内写的),错误之处在所难免,之处敬WebSite请大家批评指正!如若有所更正,我会在咯,希望大家见谅。,而不会到处特别鸣谢:jyy 等帮助人。参考资料:Linux c 编程,2005 年 9 月。郁闷的是我打算写本手册时,这本书我找了半天没有找到.里面对 GDB 的介绍还是很不错的,不过不少用不到。当年我困惑的时候这本书让我豁然开朗,学会了很多东西,介绍也比较详细,这个是最大的中文参考资料,搜索 GDB 即可获得大量资料。但是我所看到的都不够详细,远没有好。我所使用的是 F
3、ree Pascal 2.0.2 及自带的 GDB 6.2.1。不本的 Free Pascal,特别是 1.0.10 的 Free Pascal,已经很老咯。使用 GDB 调试程序必须在被调试程序中间加入调试信息,Free Pascal 和GCC 都是使用的 g 选项,在命令行下使用如下方法:使用以前版这样编译出来的程序就带有编译信息咯,可以直接被 GDB 认出来。p.s. fpc 的编译选项中文解释我已经在 DRS,OIBH 上面了,有的可Website 查找。以去看看,也可以去在 FP 的 IDE 中可以在 Option 菜单下的 mode 中间选择 Debug 模式,然后编译程序,即可使
4、编译后的程序带有调试信息。需明的是没人情况下直接按F9 编译出来的程序并没有带调试信息,但是当你按 F7 调试程序时,FP 会重新按照编译模式编译一次代码,从而使你可以编译程序。直接使用GDB 有两种形式,一种从 IDE 里面的 DeBug 菜单中GDB Window进入 GDB 界面。这样可以直接使用 GDB,但是仍然不是很稳定。我不是特别推荐,当然这个也有好处,和 IDE 结合比较紧密。比较好的方法是在命令行下面输入 gdb temp.exe 直接进入 GDB,如下:D:fpcbinwin32fpc.exe g E:prodataprogramtemptemp.pasFree Pascal
5、 Compiler ver2.0.2 2005/12/27 for i386 Copyright (c) 1993-2005 by FlorilaempflOS: Win32 for i386Compiling E:prodataprogramtemptemp.pas Linking E:prodataprogramtemptemp.exe99 Lines compiled, 0.1 secD:fpcbinwin32gdb.exe E:prodataprogramtemptemp.exe GNU gdb 6.2.1Copyright 2004 Free Software Foundation,
6、 Inc.GDB is free software, covered by the GNU General Public License, and you aree to change it and/or distribute copies of it under certain conditions.Type show copying to see the conditions.There is absoluy no warranty fDB. Type show warranty for details.This GDB was configured as i686-pc-cygwin.
7、(gdb)fpc g temp.pas这样便进入了 GDB 调试环境。当然你也可以进入 GDB 后用 file 再装入要调试的程序:退出呢?quit 拉,缩写就是 q 拉。别随便输入哦,不然你设置的断点监视什么的就没有咯,下次就会比较麻烦的咯。(gdb)是提示符,你也可以更改的,使用 set prompt userdefine 厄,我比较喜欢 GDB:可以设置成喜欢的提示符,这样看起来更加好看些。进入后你可以查看当前的语言,GDB 能够自动识别你所用的编程语言,当然也有可能不能识别,这时你可以设置一下:GDB 能够自动的识别命令的缩写,这意味着可以不入冗长的代码,而只需输入部分缩写,例如 li
8、st 可以缩写成 l,break 可以缩写成 b,这样的简写还有很多。你可以在 GDB 中尝试输入,如果 GDB 不能自动识别,也会给出所有的可能,然后让你选择。List 指令是列出代码的意思:GDBlist 1ID:bete1LANG: PASCALPROG: beads5GDBshow languageThe current source language is auto; currently pascal. GDBset language pascalGDBshow languageThe current source language is pascal. GDBset languag
9、e cGDBshow languageThe current source language is c. GDBset language pascalGDBshow languageThe current source language is pascal.(gdb) set prompt GDBGDB(gdb)file temp.exe Reading symbols from/cygdrive/e/prodata/program/temp/temp.exe.done.List 默认列出 10 行代码,你也可以指定列出哪 10 行,用 list n,这样 n 上下 5 行都会列出来,list
10、 则显示上次显示的 10 行的上面的 10 行,具体看下面的例子:GDBlko:;i:Word;Beginko:=True;For i:=1 To count DoIf datibThen ko:=False;If ko Then Exit(True);ko:=True;For i:=1 To count DoIf datiwThen ko:=False; GDBlIf ko Then Exit(True);ko:=True;For i:=1 To count DoIf datirThen ko:=False;same:=ko;End;73Procedure main;Vari,tmp:Wor
11、d; GDBl -Vardat:Array1.350Of Char;fin,fout:Text;count,zoo:Word; 10GDBlProcedure Init;Vari:Word;BeginAssign(fin,beads.in);Reset(fin);Readln(fin,count);FillChar(dat,sizeof(dat),#0);For i:=1 To count Do Read(fin,dati);Close(fin);Run 命令可以让程序运行,可以简写为 r。不过是来调试的,当然不要直接运行拉,调试就少不了断点,断点使用b 即 break 来设置,用法是 b 行
12、号,譬如 b 12,如果没有行号就是在当前设置断点,这个在进入栈调试时很有用。也可以设置在进入某一个函数时停止,如 b find,注意:主程序的断点名称是 main,和 C 里面的一样的名字!Break 也有高级应用,如可以条件判断Break if 例如:break if x=1当 x=1 时,程序会自动暂停!Break find if i=5当 find 函数中的 i=5 时,程序会自动暂停。我设置了断点如何查看呢?使用 info break 就会列出所有的断点详细信息:设置了断点我停是停下来咯,我还要继续运行程序啊!当然,使用 c 即 continue 来继续运行程序。可以GDBb 62B
13、reakpo1 at $4012c4: file temp.pas, line 62. GDBb mainBreakpo2 at $40149c: file temp.pas, line 97. GDBinfo bNum TypeDisp Enb AddressWhatbreakpokeep y $004012c4 in SAME at temp.pas:62breakpokeep y $0040149cain at temp.pas:97ko:;i:Word;Beginko:=True;For i:=1 To count DoIf datibThen ko:=False;If ko Then
14、 Exit(True);ko:=True;For i:=1 To count DoIf datiwThen ko:=False;厄,设置错误了怎么办?退出重新来呗!嘿嘿,当然不要那么麻烦拉! Del 即可!用法:del n (n 为断点号)。那如果我要暂时使某个断点不可用怎么办啊?disable n(n enable n 就是恢复断点的使用拉!为断点号)厄,断点我是知道使用了,只有断点也没有用啊!我又不能查看变量的值,怎么弄啊。呵呵,这个当然要有的拉 pr先启动程序:x(x 为变量名称)。厄,还得补充点知识,在 FE 中间按 F7,F8,时是步进,GDB 中F7 是什么指令呢?Step!即 s
15、 n(n 表示前进几步)F8 是 n 即 next,大家自己试试吧。和 S 一样的属性哦。GDBsINIT () at temp.pas:15Assign(fin,beads.in); GDBsReset(fin); GDBsReadln(fin,count);GDBprcount$1 = 0GDBRStarting program: /cygdrive/e/prodata/program/temp/temp.exe Breakpo2, main () at temp.pas:9797Init;GDBdisable 1 GDBinfo bNum TypeDisp Enb AddressWhat
16、breakpokeep n $004012c4 in SAME at temp.pas:62breakpokeep y $0040149cain at temp.pas:97 GDBenable 1GDBinfo bNum TypeDisp Enb AddressWhatbreakpokeep y $004012c4 in SAME at temp.pas:62breakpokeep y $0040149cain at temp.pas:97 GDBdel 1GDBinfo bNum TypeDisp Enb AddressWhat2 breakpokeep y $0040149cain at
17、 temp.pas:97Pr使用还是很方便的,可以用来输出一个表达式的值,并输出下一行的代码。与 P 类似的是 echo,大家可以输入 help echo 了解。另外有个 output只输出值,而不输出下一行代码,而且不把打印的值在历史中间。Display 可以设置一些自动显示的变量,当程序停住时,或是在但不这些变量会自动显示,用法:时,Expr 为一个表达式。如果进入一个函数了, 直接退出怎么办啊,老在里面转很晕呢,OK,没有问题,你可以使用 u 即 until 来返回,它将运行到函数返回,除非中间还有别的断点。用 IDE 中间的 Watch 功能呢,厄.当然还是 watch 拉,而且远比I
18、DE 中间的功能强大!Watch exp exp 为表达式,可以简单的就只要监视变量的值的改变就有咯。而且,当你的程序运行时,倘若监视的变量的值发生了改变,程序会自动暂停下来,并输出值和下一行代码。这样你可以很方便的查看咯!怎么样,比 IDE中间的功能强大吧,Display GDBs18FillChar(dat,sizeof(dat),#0);GDBprcount$2 = 29GDBli:Word;BeginAssign(fin,beads.in);Reset(fin);Readln(fin,count);FillChar(dat,sizeof(dat),#0);For i:=1 To cou
19、nt Do Read(fin,dati);Close(fin);End;22GDBnFor i:=1 To count Do Read(fin,dati); GDBnClose(fin); GDBnEnd;GDBnmain () at temp.pas:9898main;GDBwatch iHardware watchpo3: I GDBwatch countHardware watchpo4: COUNT GDBinfo watchNum TypeDisp Enb AddressWhatbreakpokeep y $004012c4 in SAME at temp.pas:62 breakp
20、oalready hit 1 timebreakpokeep y $0040149cain at temp.pas:97 breakpoalready hit 1 timehw watchpokeep yIhw watchpokeep yCOUNT GDBinfo breakNum TypeDisp Enb AddressWhatbreakpokeep y $004012c4 in SAME at temp.pas:62 breakpoalready hit 1 timebreakpokeep y $0040149cain at temp.pas:97 breakpoalready hit 1
21、 timehw watchpokeep yIhw watchpokeep yCOUNTGDBcContinuing.Program received signal SIGTRAP, Trace/breakpotrap.$00401070 in INIT () at temp.pas:1717Readln(fin,count);GDBprcount$5 = 29GDBcContinuing.Breakpo1, SAME () at temp.pas:6262If datibThen ko:=False; GDBp i$6 = 1GDBcContinuing.Breakpo1, SAME () a
22、t temp.pas:6262If datibThen ko:=False; GDBp i$7 = 2删除监视和删除断点一样的方法,直接 delete n(n 为)。另外还有 rwatch 和 awatch,一个是当表达式被读时暂停程序,一个是当表达式被读或写时暂停程序。感觉要的功能差不多了,但是我发现程序运行过头了,重新运行,怎么办啊?晕死,这还不简单啊,看见那个 X 咯么?点击就有咯啊!厄,其实可以很简单的,输入 k 即 kill 就可以把调试的程序进程 cut 咯!而且设置的断点什么全部保存咯。不知道程序什么状态?很简单嘛,输入 info program 就会显示程序当前状态,运行还是
23、ready。GDBkGDBinfo programThe program being debugged is not being run.GDBinfo bNum TypeDisp Enb AddressWhatbreakpokeep y $004012c4 in SAME at temp.pas:62 breakpoalready hit 3 timesbreakpokeep y $0040149cain at temp.pas:97 breakpoalready hit 1 time4 hw watchpokeep yCOUNT GDBd 1GDBinfo bNum TypeDisp En
24、b AddressWhat2 breakpokeep y $0040149cain at temp.pas:97 breakpoalready hit 1 time4 hw watchpokeep yCOUNT好拉,不完全手册到这里就基本结束咯,已经足够应付调试程序咯。下面再次回顾 GDB 的常用命令:命令缩写用法作用、备注HelpHHd显示命令的帮助,不懂就要多多使用File无File filename装入要调试的可执行文件InfoIInfo optionoption 可以是 program,break.RunRR运行要调试的程序Step步进,相当于 F7,n 为步进次数NextNN n下一
25、步,相当于F8,n 为下一步的次数ContinueCC继续执行程序BreakBB optionOption 可以是 num 或者 functioonWatchWW exp监视表达式的值KillKK结束当前调试的程序PrPP exp打印表达式的值OutputOO exp同 pr,但是不输出下一行的语句EchoEE e同 prPwdPwdPwd显示当前路径,用过linux 的人都知道info watch|break显示断点和监视DeleteDD num删除为 num 的断点和监视Show language显示当前语言Set language pascal设置代码语言DisableDisable n
26、为 n 的断点暂时无效无EnableEnable n与 disable 相反无DiplayDisplay expr无暂停,步进时自动显示表达式的值附源代码:ID:bete1LANG: PASCALPROG: beads/尽管完成咯, Var还不是最佳的dat:Array1.350Of Char; fin,fout:Text; count,zoo:Word;Procedure Init;Vari:Word;BeginAssign(fin,beads.in); Reset(fin); Readln(fin,count); FillChar(dat,sizeof(dat),#0);For i:=1 To count Do Read(fin,dati); Close(fin);End;Function find(n:Word):Word;Vark,ok,nk:Word; ch,tmp:Char;did:Begink:=n; ch:=datk; tmp:=ch; did:=False; RepeatInc(k);If k=n Then Exit(count);If k=count+1 Then If not did Then Begin k:=1;did:=True;End Else Brea
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 扭转治疗分享会
- 培训学校招生宣传
- 初级会计经济法基础-初级会计《经济法基础》预测试卷325
- 产业研究报告-2024年中国磁悬浮轴承行业发展现状、市场规模、投资前景分析(智研咨询)
- 二零二五版消防设施维保与应急预案演练合同3篇
- 二零二五年度设备租赁及融资租赁合同6篇
- 二零二五年度机械设备销售代理合同范本2篇
- 二零二五年度个人对电信行业用户信息保密合同
- 二零二五年度个人虾池承包养殖市场推广与合作合同3篇
- 二零二五版新型小区商铺物业服务与社区共建合同3篇
- 六年级上册数学课件-第五单元 数据处理 北师大版
- YY/T 1496-2016红光治疗设备
- 郑州小吃详细地点
- 上海高考英语词汇手册
- 2021年江苏省淮安市淮阴中学高一政治下学期期末试题含解析
- 2021年道路交通安全法期末考试试题含答案
- 自带药物治疗告知书
- 建筑制图与阴影透视-第3版-课件12
- 2023年最新的校长给教师春节祝福语
- 吞咽解剖和生理研究
- TSG11-2020 锅炉安全技术规程
评论
0/150
提交评论