gdb调试

来源:互联网 发布:alpine linux 添加源 编辑:程序博客网 时间:2024/05/29 06:44

一、程序编译

gdb是Linux下的一个调试工具。使用gdb调试程序,首先必须在用gcc编译源码时加上-g选项,将程序源码信息加入可执行文件(这并不意味着调试过程中不需要源码文件了,如果源码文件不在编译时的路径,以编译时的文件名存在,调试中会找不到文件)。在调试过程中可通过list命令查看程序对应的源码。

二、进入gdb

可通过两种途径进入gdb:

其一,输入gdb命令回车,然后使用file命令加载想要调试的程序;

其二,直接使用 gdb 可执行程序名;

三、gdb常用命令

1、指定程序入参: set args argv1 argv2 ...

      也可以通过run 命令运行时指定,如: run argv1 argv2 ...

2、list(或 l)命令查看源码

     list  开始行号  // 输出自指定行开始10行源码(默认输出10行)

     list  开始行号,结束行号  //指定行区间内源码

     list  函数名

     list -  // 显示当前位置前10行源码

3、break 设置断点

    1)无条件断点:程序运行到达断点即会中断。

     b   函数名

     b   行号

     b   文件名:行号

     b   文件名:函数名

     b   +偏移量   // 没有实际操作过

     b   -偏移量

     b   *地址

    

    2)查询已设置的断点信息

    info break(或 i b)

 

    3)条件断点:条件为真时中断。

    b   断点  if  条件   // 新设置

    b   断点编号 条件  // 已经存在的断点仅在条件满足时终端

    condition 断点编号  //为已经存在的断点增加/删除条件

 

    4)删除断点

     delete 断点编号

 

4、run(或 r) 运行程序

 

5、backtrace (或 bt)查看当前调用栈信息,也可用where

6、info locals(或 i locals) 显示当前栈帧局部变量的值

      info register(或 i r) 查看寄存器

     info args   查看当前桢中的参数

     info catch 查看当前桢中的异常处理器

     info frame N  查看调用栈中的某个栈帧

 

7、print(或 p)显示变量,也可以使用display

    1)查看非数组变量

      p 变量名  // 输出变量值

      p  文件名::变量名  

      p   函数名::变量名 // p 'f1.c'::gv   查看f1.c文件全局变量gv的值

 

    2)查看数组变量(包括静态数组和动态数组)

     p *array@len

     p *array@len     // 二维数组

     静态数组通过 p 数组名 也可以查看

     set print element 0  // 取消Linux对打印字符串的长度限制

 

   3)print 高级选项===查看寄存器或变量值

     p/f 变量

    f  输出格式:d  有符号十进制

                           u   无符号十进制

                           t    二进制(two)

                           x   十六进制

                           c  字符

                           f   浮点数

                           a   地址

8、next(或 n)执行下一条语句

9、step(或 s) 执行下一条语句,若是函数,则进入函数内部。

10、continue (或 c)继续运行程序;continue N 可以继续运行程序,并在第N+1次(即忽略N次)经过断点的时候中断。

11、watch 监视点

      watch <表达式> //当表达式(可以是常量或变量)值发生变化时中断

     awatch <表达式> //当表达式(可以是常量或变量)被访问或值发生变化时中断。(a代表all吧。)

      rwatch <表达式> //当表达式(可以是常量或变量)被访问发生变化时中断。(r代表read吧。)

 

12、whatis或ptype查看变量类型。

13、frame(或 f)帧编号  // 选择栈帧

14、finish 继续运行至当前函数返回时中断。

15、set var  修改变量值   // 如 set var 变量名=值,貌似也可以不要var

        set $1=2

16、jump 行号 //跳转到某行

17、x/ <n/f/u>  <addr>   查看内存地址内容

       其中,n为一个正整数,表示需要显示从address开始的内存单元个数。

       f 表示显示格式:x  按十六进制显示

                                     d  十进制

                                     u  十六进制显示无符号整型

                                     t    二进制

                                     c   字符

                                     f     浮点数

      u  表示一个内存单元代表的字节数。默认4字节。

             b/h/w/g   单、双、四、八字节

            

 

gdb环境下直接回车,即表示重复执行上一条命令。

调用gdb时可以指定"启动文件"。如:gdb --command=sf ex,表示要在可执行文件ex上运行gdb,首先要从文件sf中读取命令。

 

 

 

linux下,通过gdb调试多线程问题。

1、top命令或'ps -ef|grep 进程名' 获取问题进程的PID

top -H -p PID可以查看进程内所有线程的运行状态;

2、利用gdb来 attach 目标进程,执行 gdb 进程名 PID

info threads  ==>查看各个线程正在执行的函数,以及gdb为各个线程分配的标号

thread 线程标号 ==> 切换到指定线程

bt==>查看线程当前的调用栈

b 断点位置 thread N if 条件  // 当线程N到达源码的指定位置且满足条件时中断

b 断点位置 thread all  //为所有经过指定位置的线程设置断点。

 

set scheduler-locking off|on|step    //  不甚理解,还需研究!

off 不锁定任何线程,也就是所有线程都执行,这是默认值。

on 只有当前被调试程序会执行。

step 在单步的时候,除了next过一个函数的情况以外,只有当前线程会执行。

 

0 0
原创粉丝点击