gdb调试

一、程序编译

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过一个函数的情况以外,只有当前线程会执行。

 

### GDB调试基础 GDB 是 GNU 调试器 (GNU Debugger),用于调试 C 和 C++ 程序。它允许开发者分析崩溃原因并逐步跟踪程序运行过程中的状态变化。 #### 编译带有调试信息的程序 为了能够使用 GDB 进行有效的调试,必须在编译阶段加入 `-g` 参数以包含调试符号表。这可以通过 GCC 或其他支持此选项的编译器完成[^2]。例如: ```bash gcc -g -std=c99 -o bug bug.c ``` 上述命令会生成名为 `bug` 的可执行文件,并附带完整的调试信息。 #### 启动 GDB 并加载目标程序 通过指定目标二进制文件作为参数来启动 GDB。如果成功读取到符号信息,则会在终端显示类似于 “Reading symbols from...done.” 的消息[^1]。以下是具体操作方式: ```bash gdb demo1 ``` 此时进入交互模式,在这里可以输入各种指令控制被调试的应用进程行为。 #### 基本GDB命令概览 - **run**: 开始或重新开始程序执行。可以选择提供命令行参数给待测应用。 ```bash run arg1 arg2 ... ``` - **breakpoint 设置断点**: 可以按函数名或者源码行号设置停止点以便更细致地观察变量值的变化情况。 ```bash break main # 在main函数入口处设停靠位 break filename.c:line_number # 定义特定位置上的暂停标记 ``` - **step/next 单步执行**: step 会深入调用子功能内部;而 next 则仅跨越当前语句而不展开其细节。 ```bash step # 步入下一个逻辑单元(可能跳转至另一方法) next # 继续直到下一条顶层表达式被执行完毕 ``` - **print 查看变量值**: 动态获取内存中存储的数据实例。 ```bash print variable_name # 输出某个已声明对象的内容 ``` - **continue 恢复流程直至下一断点到达前继续正常运转** ```bash continue # 让应用程序按照常规顺序前进,除非遇到新的障碍物才会再次中断下来等待进一步指示 ``` - **quit 结束会话退出工具界面返回shell环境当中去** ```bash quit # 关闭整个工作区离开debugger回到操作系统提示符之下 ``` 以上只是部分常用特性介绍而已,实际上还有许多高级技巧可供探索学习。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值