linux系统调试工具GDB命令详细解释.doc_第1页
linux系统调试工具GDB命令详细解释.doc_第2页
linux系统调试工具GDB命令详细解释.doc_第3页
linux系统调试工具GDB命令详细解释.doc_第4页
linux系统调试工具GDB命令详细解释.doc_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Linux中包含有一个很有用的调试工具gdb(GNU Debuger),它可以用来调试C和C+程序,功能不亚于Windows下的许多图形界面的调试工具。和所有常用的调试工具一样,gdb提供了以下功能:# 监视程序中变量的值# 在程序中设置断点# 程序的单步执行在使用gdb前,必须先载入可执行文件,因为要进行调试,文件中就必须包含调试信息,所以在用gcc或cc编译时就需要用-g参数来打开程序的调试选项。调试开始时,必须先载入要进行调试的程序,可以用以下两种方式:* 在启动gdb后执行以下命令:file 可执行文件路径* 在gdb启动时就载入程序:gdb 可执行文件路径载入程序后,接下来就是要进行

2、断点的设置,要监视的变量的添加等工作,下面对在这个过程中常会用到的命令逐一进行介绍:* list :显示程序中的代码,常用使用格式有:list输出从上次调用list命令开始往后的10行程序代码。list -输出从上次调用list命令开始往前的10行程序代码。list n输出第n行附近的10行程序代码。list function输出函数function前后的10行程序代码。* forward/search :从当前行向后查找匹配某个字符串的程序行。使用格式:forward/search 字符串查找到的行号将保存在$_变量中,可以用print $_命令来查看。* reverse-search :和

3、forward/search相反,向前查找字符串。使用格式同上。* break :在程序中设置断点,当程序运行到指定行上时,会暂停执行。使用格式:break 要设置断点的行号* tbreak :设置临时断点,在设置之后只起作用一次。使用格式:tbreak 要设置临时断点的行号* clear :和break相反,clear用于清除断点。使用格式:clear 要清除的断点所在的行号* run :启动程序,在run后面带上参数可以传递给正在调试的程序。* awatch :用来增加一个观察点(add watch),使用格式:awatch 变量或表达式当表达式的值发生改变或表达式的值被读取时,程序就会停

4、止运行。* watch :与awatch类似用来设置观察点,但程序只有当表达式的值发生改变时才会停止运行。使用格 式:watch 变量或表达式需要注意的是,awatch和watch都必须在程序运行的过程中设置观察点,即可运行run之后才能设置。* commands :设置在遇到断点后执行特定的指令。使用格式有:commands设置遇到最后一个遇到的断点时要执行的命令commands n设置遇到断点号n时要执行的命令注意,commands后面跟的是断点号,而不是断点所在的行号。在输入命令后,就可以输入遇到断点后要执行的命令,每行一条命令,在输入最后一条命令后输入end就可以结束输入。* dele

5、te :清除断点或自动显示的表达式。使用格式:delete 断点号* disable :让指定断点失效。使用格式:disable 断点号列表断点号之间用空格间隔开。* enable :和disable相反,恢复失效的断点。使用格式:enable 断点编号列表* ignore :忽略断点。使用格式:ignore 断点号 忽略次数* condition :设置断点在一定条件下才能生效。使用格式:condition 断点号 条件表达式* cont/continue :使程序在暂停在断点之后继续运行。使用格式:cont跳过当前断点继续运行。cont n跳过n次断点,继续运行。当n为1时,cont 1即

6、为cont。* jump :让程序跳到指定行开始调试。使用格式:jump 行号* next :继续执行语句,但是跳过子程序的调用。使用格式:next执行一条语句next n执行n条语句* nexti :单步执行语句,但和next不同的是,它会跟踪到子程序的内部,但不打印出子程序内部的语句。使用格式同上。* step :与next类似,但是它会跟踪到子程序的内部,而且会显示子程序内部的执行情况。使用格式同上。* stepi :与step类似,但是比step更详细,是nexti和step的结合。使用格式同上。* whatis :显示某个变量或表达式的数据类型。使用格式:whatis 变量或表达式*

7、 ptype :和whatis类似,用于显示数据类型,但是它还可以显示typedef定义的类型等。使用格式:ptype 变量或表达式* set :设置程序中变量的值。使用格式:set 变量=表达式set 变量:=表达式* display :增加要显示值的表达式。使用格式:display 表达式* info display :显示当前所有的要显示值的表达式。* delete display/undisplay :删除要显示值的表达式。使用格式:delete display/undisplay 表达式编号* disable display :暂时不显示一个要表达式的值。使用格式:disable d

8、isplay 表达式编号* enable display :与disable display相反,使用表达式恢复显示。使用格式:enable display 表达式编号* print :打印变量或表达式的值。使用格式:print 变量或表达式表达式中有两个符号有特殊含义:$和$。$表示给定序号的前一个序号,$表示给定序号的前两个序号。如果$和$后面不带数字,则给定序号为当前序号。* backtrace :打印指定个数的栈帧(stack frame)。使用格式:backtrace 栈帧个数* frame :打印栈帧。使用格式:frame 栈帧号* info frame :显示当前栈帧的详细信息。

9、* select-frame :选择栈帧,选择后可以用info frame来显示栈帧信息。使用格式:select-frame 栈帧号* kill :结束当前程序的调试。* quit :退出gdb。 如要查看所有的gdb命令,可以在gdb下键入两次Tab(制表符),运行“help command”可以查看命令command的详细使用格式。本文仅对使用gdb调试过程中的一些常用指令的用法进行简单地总结,如要获取关于gdb的更详细的资料,请参阅gdb的官方文档:/software/gdb/documentation/ gdb 命令大全1. 启动gdb 应用程序名gd

10、b 应用程序名 core文件名gdb 应用程序名 pid gdb -args 应用程序名 应用程序的运行参数帮助:help 显示帮助info 显示程序状态set 修改show 显示gdb状态运行及运行环境设置:set args # 设置运行参数show args # 显示运行参数set env 变量名 = 值 # 设置环境变量unset env 变量名 # 取消环境变量show env 变量名 # 显示环境变量path 目录名 # 把目录添加到查找路径中show paths # 显示当前查找路径cd 目录 # 切换工作目录pwd # 显示当前工作目录tty /dev/pts/1 # 修改程序的

11、输入输出到指定的ttyset inferior-tty /dev/pts/1 # 修改程序的输出到指定的ttyshow inferior-ttyshow ttyrun 参数 # 运行start 参数 # 开始运行,但是会在main函数停止attach piddetachkill # 退出Ctrl-C # 中断(SIGINT)Ctrl-线程操作:info threads # 查看所有线程信息thread 线程id # 切换到指定线程thread apply threadno | all 参数 # 对所有线程都应用某个命令子进程调试:set follow-fork-mode child|paren

12、t # fork后,需要跟踪谁show follow-fork-modeset detach-on-flow on|off # fork后,需要两个都跟踪吗info forks # 显示所有进程信息fork 进程id # 切换到某个进程detach-fork 进程id # 不再跟踪某个进程delete fork 进程id # kill某个进程并停止对它的跟踪检查点: checkpoint/restart查看停止原因:info program断点(breakpoint): 程序运行到某处就会中断break(b) 行号|函数名|程序地址 | +/-offset | filenam:func if

13、条件 # 在指定位置设置断点tbreak . # 与break相似,只是设置一次断点hbreak . # 与break相似,只是设置硬件断点,需要硬件支持thbreak . # 与break相似,只是设置一次性硬件断点,需要硬件支持rbreak 正则表达式 # 给一批满足条件的函数打上断点info break 断点号 # 查看某个断点或所有断点信息set breadpoint pending auto|on|off # 查看如果断点位置没有找到时行为show breakpoint pending观察点(watchpoint): 表达式的值修改时会被中断watch 表达式 # 当表达式被写入,并

14、且值被改变时中断rwatch 表达式 # 当表达式被读时中断awatch 表达式 # 当表达式被读或写时中断info watchpoints set can-use-hw-watchpoints 值 # 设置使用的硬件观察点的数show can-use-hw-watchpoints rwatch与awatch需要有硬件支持,另外如果是对局部变量使用watchpoint,那退出作用域时观察点会自动被删除另外在多线程情况下,gdb的watchpoint只对一个线程有效捕获点(catchpoint): 程序发生某个事件时停止,如产生异常时catch 事件名事件包括:throw # 产生c+异常cat

15、ch # 捕获到c+异常exec/fork/vfork # 一个exec/fork/vfork函数调用,只对HP-UXload/unload 库名 # 加载/卸载共享库事件,对只HP-UXtcatch 事件名 # 一次性catchinfo break断点操作:clear 函数名|行号 # 删除断点,无参数表示删卫当前位置delete 断点号 # 删除断点,无参数表示删所有断点disable 断点号enable 断点号condition 断点号 条件 # 增加断点条件condition 断点号 # 删除断点条件ignore 断点号 数目 # 忽略断点n次commands 断点号 # 当某个断点中

16、断时打印条件条件end下面是一个例子,可以一直打印当前的X值:commands 3printf X:%d/n,xcontend断点后操作:continue(c) 忽略次数 # 继续执行,忽略前面n次中断fg 忽略次数 # 继续执行,忽略前面n次中断step(s) n步 # 步进,重复n次next(n) n步 # 前进,重复n次finish # 完成当前函数调用,一直执行到返回处,并打印返回值until(u) 位置 # 一直执行到当前行或指定位置,或是当前函数返回advance 位置 # 前面到指定位置,如果当前函数返回则停止,与until类似stepi(si) n步 # 精确的只执行一个汇编指

17、令,重复n次nexti(ni) n步 # 精确的只执行一个汇编指令,碰到函数跳过,重复n次set step-mode on|off # on时,如果函数没有调试信息也跟进show step-mode信号:info signals # 列出所有信号的处理方式info handle # 同上handle 信号 方式 # 改变当前处理某个信号的方式方式包括:nostop # 当信号发生时不停止,只打印信号曾经发生过stop # 停止并打印信号print # 信号发生时打印noprint # 信号发生时不打印pass/noignore # gdb充许应用程序看到这个信号nopass/ignore #

18、gdb不充许应用程序看到这个信号线程断点:break 行号信息 thread 线程号 if 条件 # 只在某个线程内加断点线程调度锁:set scheduler-locking on|off # off时所有线程都可以得到调度,on时只有当前show scheduler-locking帧:frame(f) 帧号 # 不带参数时显示所有帧信息,带参数时切换到指定帧frame 地址 # 切换到指定地址的帧up n # 向上n帧down n # 向下n帧select-frame 帧号 # 切换到指定帧并且不打印被转换到的帧的信息up-silently n # 向上n帧,不显示帧信息down-sile

19、ntly n # 向下n帧,不显示帧信息调用链:backtrace(bt) n|-n|full # 显示当前调用链,n限制显示的数目,-n表示显示后n个,n表示显示前n个,full的话还会显示变量信息使用 thread apply all bt 就可以显示所有线程的调用信息set backtrace past-main on|off show backtrace past-main set backtrace past-entry on|off show backtrace past-entryset backtrace limit n # 限制调用信息的显示层数show backtrace

20、limit显示帧信息:info frame # 显示当前帧信息info frame addr # 显示指定地址的帧信息info args # 显示帧的参数info locals # 显示局部变量信息info catch # 显示本帧异常信息显示行号:list(l) 行号|函数|文件:行号 # 显示指定位置的信息,无参数为当前位置list - # 显示当前行之前的信息list first,last # 从frist显示到last行list ,last # 从当前行显示到last行list frist, # 从指定行显示list + # 显示上次list后显示的内容list - # 显示上次lis

21、t前面的内容在上面,first和last可以是下面类型:行号+偏移-偏移文件名:行号函数名函数名:行号set listsize n # 修改每次显示的行数show listsize编辑:edit 行号|函数|函数名:行号|文件名:函数名 # 编辑指定位置查找:search 表示式 # 向前查找表达式reverse-search 表示式 # 向后查找表达式指定源码目录:directory(dir) 目录名 # 指定源文件查找目录show directories源码与机器码:info line 函数名|行号 # 显示指定位置对应的机器码地址范围disassemble 函数名 | 起始地址 结束地址

22、 # 对指定范围进行反汇编set disassembly-flavor att|intel # 指定汇编代码形式show disassembly-flavor查看数据:ptype 表达式 # 查看某个表达式的类型print /f 表达式 # 按格式查看表达式内容,/f是格式化set print address on|off # 打印时是不是显示地址信息show print addressset print symbol-filename on|off # 是不是显示符号所在文件等信息show print symbol-filenameset print array on | off # 是不是

23、打印数组show print arrayset print array index on | off # 是不是打印下标show print array index.表达式可以用下面的修饰符:varn # 表示把var当成长度为n的数组filename:var # 表示打印某个函数内的变量,filename可以换成其它范围符如文件名type var # 表示把var当成type类型输出格式:x # 16进制d # 10进制u # 无符号o # 8进制t # 2进制a # 地址c # 字符f # 浮点查看内存:x /nfu 地址 # 查看内存n 重复n次f 显示格式,为print使用的格式u 每

24、个单元的大小,为b byteh 2 bytew 4 byteg 8 byte自动显示:display /fmt 表达式 # 每次停止时都会显示表达式,fmt与print的格式一样,如果是内存地址,那fmt可像 x的参数一样undisplay 显示编号delete display 显示编号 # 这两个都是删附某个显示disable display 显示编号 # 禁止某个显示enable display 显示编号 # 重显示display # 显示当前显示内容info display # 查看所有display项查看变量历史:show values 变量名 n # 显示变量的上次显示历史,显示n条

25、show values 变量名 + # 继续上次显示内容便利变量: (声明变量的别名以方便使用)set $foo = *object_ptr # 声明foo为object_ptr的便利变量init-if-undefined $var = expression # 如果var还未定义则赋值show convenience内部便利变量:$_ 上次x查看的地址$_$_exitcode 程序垢退出码寄存器:into registers # 除了浮点寄存器外所有寄存器info all-registers # 所有寄存器into registers 寄存器名 # 指定寄存器内容info float # 查

26、看浮点寄存器状态info vector # 查看向量寄存器状态gdb为一些内部寄存器定义了名字,如$pc(指令),$sp(栈指针),$fp(栈帧),$ps(程序状态)p /x $pc # 查看pc寄存器当前值x /i $pc # 查看要执行的下一条指令set $sp += 4 # 移动栈指针内核中信息:info udot # 查看内核中user struct信息info auxv # 显示auxv内容(auxv是协助程序启动的环境变量的)内存区域限制:mem 起始地址 结构地址 属性 # 对地始地址,结构地址)区域内存进行保护,如果结构地址为0表示地址最大值0xffffffffdelete m

27、em 编号 # 删除一个内存保护disable mem 编号 # 禁止一个内存保护enable mem 编号 # 打开一个内存保护info mem # 显示所有内存保护信息保护的属性包括:1. 内存访问模式: ro | wo |rw2. 内存访问大小: 8 | 16 | 32 | 64 如果不限制,表示可按任意大小访问3. 数据缓存: cache | nocache cache表示充许gdb缓存目标内存内存复制到/从文件:dump 格式 memory 文件名 起始地址 结构地址 # 把指定内存段写到文件dump 格式 value 文件名 表达式 # 把指定值写到文件格式包括:binary 原始

28、二进制格式ihex intel 16进制格式srec S-recored格式tekhex tektronix 16进制格式append binary memory 文件名 起始地址 结构地址 # 按2进制追加到文件append binary value 文件名 表达式 # 按2进制追加到文件restore 文件名 binary bias 起始地址 结构地址 # 恢复文件中内容到内存.如果文件内容是原始二进制,需要指定binary参数,不然会gdb自动识别文件格式产生core dump文件gcore 文件名 # 产生core dump文件字符集:set target-charset 字符集 #

29、声明目标机器的locale,如gdbserver所在机器set host-charset 字符集 # 声明本机的localeset charset 字符集 # 声明目标机和本机的localeshow charsetshow host-charsetshow target-charset缓存远程目标的数据:为提高性能可以使用数据缓存,不过gdb不知道volatile变量,缓存可能会显示不正确的结构set remotecache on | offshow remotecache info dcache # 显示数据缓存的性能C预处理宏:macro expand(exp) 表达式 # 显示宏展开结果

30、macro expand-once(expl) 表达式 # 显示宏一次展开结果macro info 宏名 # 查看宏定义追踪(tracepoint): 就是在某个点设置采样信息,每次经过这个点时只执行已经定义的采样动作但并不停止,最后再根据采样结果进行分析。采样点定义:trace 位置 # 定义采样点info tracepoints # 查看采样点列表delete trace 采样点编号 # 删除采杰点disable trace 采样点编号 # 禁止采杰点enable trace 采样点编号 # 使用采杰点passcount 采样点编号 n # 当通过采样点 n次后停止,不指定n则在下一个断点

31、停止预定义动作:预定义动作以actions开始,后面是一系列的动作actions num # 对采样点num定义动作行为:collect 表达式 # 采样表达式信息一些表达式有特殊意义,如$regs(所有寄存器),$args(所有函数参数),$locals(所有局部变量)while-steping n # 当执行第n次时的动作,下面跟自己的collect操作采样控制:tstart # 开始采样tstop # 停止采样tstatus # 显示当前采样的数据使用收集到的数据:tfind start # 查找第一个记录tfind end | none # 停止查找tfind # 查找下一个记录tfind - # 查找上一个记录tfind tracepoint N # 查找 追踪编号为N 的下一个记录tfind pc 地址 # 查找代码在指定地址的下一个记录tfind range 起始,结束tfind outside 起始,结构tfind line 文件名:行号tdump # 显示当前记录中追踪

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论