gdb 调试

GDB是功能强大的调试程序,可完成如下的调试任务:

* 设置断点;

* 监视程序变量的值;

* 程序的单步执行;

* 修改变量的值。

 

在使用gdb调试程序之前,必须使用-g选项编译源文件。可以在makefile中如下定义CFLAGS变量:

CFLAGS=-g

运行gdb调试程序时通常使用如下的命令:

1、gdb progname             //progname 可执行文件

2、gdb progname core     //core文件

3、gdb progname PID      //如果程序是一个服务程序,那么可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试。

在gdb 提示符处键入help,将列出命令的分类,主要的分类有:

* aliases:命令别名

* breakpoints:断点定义;

* data:数据查看;

* files:指定并查看文件;

* internals:维护命令;

* running :程序执行;

* stack:调用栈查看;

* tracepoints:跟踪程序;

键入help后跟没拿过来的分类名,可获得该类命令的详细清单。

 

命令解释

break NUM 在指定的行上设置断点。

bt 显示所有的调用栈帧。该命令可用来显示函数的调用顺序。

clear 删除设置在特定源文件、特定上的断点:clear FILENAME:NUM

continue 继续执行正在调用的程序。该命令用在程序由于处理信号或断点而导致停止运行时

display EXPR 每次程序停止后显示表达式的值,表达式由程序定义的变量组成。

file FILE 装载指定的可执行文件进行调试。

help NAME显示指定命令的帮助信息。

info break显示当前断点清单,包括达到断点处的次数等。

info files 显示被调试文件的详细信息。

info func 显示所有函数名称。

info local 显示当前函数中的局部变量信息。

info prog 显示被调试程序的执行状态。

into var 显示所有的全局和静态变量名称。

kill 终止正被调试的程序。

list 显示源代码段。

make 在不退出gdb的情况下运行make工具。

next 在不单步执行进入其他函数的情况下,向前执行一行源代码。

print EXPR 显示表达式EXPR的值。

 

 

GDB中运行UNIX的shell程序

在gdb环境中,执行unix的shell命令,使用gdb的shell命令来完成:

       shell <command string>

        调用UNIX的shell来执行<command string>,环境变量SHELL中定义的UNIX的shell将会被用来执行<command string>,如果SHELL没有定义,那就使用UNIX的标准shell:/bin/sh.

 还有一个gdb命令是make:

         make <make-args>

         可以在gdb中执行make命令来重新build自己的程序。这个命令等价于"shell make <make-args>".

 

在GDB中运行程序

在gdb中,运行程序使用r或是run命令。

1.程序运行参数

           set args 可指定运行是参数。(如:set args 10 30)

           show args

2.运行环境。

           path <dir> 可设定程序的运行路径。

           show paths 查看程序的运行路径。

            set environment varname [= value]设置环境变量。如:set env USER=hdc

           show environment [varname] 查看环境变量。

3.工作目录

            cd <dir> 相当于shell的cd命令。

            pwd显示当前的所在目录。

4.程序的输入输出。

            info terminal 显示程序用到的终端的模式。

            tty 命令可以值写输入输出的终端设备,如:tty /dev/ttyb

 

调试已运行的程序

两种方法:

1.在UNIX下用ps查看正在运行的程序的PID,然后用gdb <program> PID格式挂接正在运行的程序。

2.先用gdb <grogram> 关联上源代码,并运行gdb,在gdb中用attach命令来挂接进程的PID,并用detach来取消挂接的进程。

 

暂停/恢复程序运行

调试程序中,暂停程序运行。

当进程被gdb停住时,可以使用info program来查看程序的是否在运行,进程号,被暂停的原因。

在gdb中,有几种暂停方式:断点(BreakPoint)、观察点(WachPoint)、扑捉点(CatchPint)、信号(Signals),县城停止。要恢复运行程序,使用c或是continue命令。

1设置断点

      break <function>

      break <linenum>

      break + offset

      break -offset

      break filename:linenum

      break filename:funciton

      break *address  //在程序运行的内存地址处停住。

      break             //命令没有参数,表示在下一条指令出停住。

      break ... if<condition>  //...可以是上次的参数,condition表示条件,条件成立时停住。

2.设置观察点

         watch <expr>     //有变化时,马上停住程序

         rwatch <expr>  //expr被读是,停住程序

         awatch <expr> //被读或被写

  

3.设置捕捉点
设置捕捉点来捕捉程序运行时的一些事件。如:载入共享库(动态链接库)或是c++ 异常。

       catch <event>            //关键字:throw,catch,exec,for,fork,vfork load

        1.throw 一个C++抛出的异常。

        2.catch 一个C++捕捉到的异常

        3.exec调用系统调用exec时。

        4.fork 调用系统调用fork时

        5.vfork调用系统调用vfork时。

        6.load或load <libname> 载入共享库

        7.unload或unload <libname> 卸载共显库

查看运行时数据

          print <expr>

改变程序的执行

     1.修改变量的值

        (gdb) print x=5

        (gdb)set variabel =34

        (gdb)what is variable //查看变量的类型

      2.跳转执行

         jump <linespec>    //可以是文件的行号,可以是file:line格式

         jump <address>    //代码行的内存地址。

      3.产生信号量

         signal <singal> //UNIX的系统信号量通常从1到15.

      4.强制函数返回   //使用return 命令取消当前函数的执行,并立即返回。

         return

         return <expression>

       5 强制调用函数

        call <expr> //表达式中可以一是函数,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值