Linux开发工具01:使用GDB调试代码

写在前面

  • 这里主要记录一下如何使用GBD进行调试;

一、安装GDB

  • 参考博客:Ubuntu下gdb的安装;
  • 在官网上查看当前的GDB最新版本,链接在:https://ftp.gnu.org/gnu/gdb/;
  • 在Linux下新建一个文件夹并进入该文件夹中,将GDB压缩包下载到该文件夹中:
mkdir gdb
cd gdb
# 下载压缩包
wget http://ftp.gnu.org/gnu/gdb/gdb-13.1.tar.gz
  • 而后解压并使用make安装:
# 解压
tar -zxf gdb-13.1.tar.gz

cd gdb-13.1
# 生成makefile文件
./configure
# 实际编译代码,生成可执行文件
make
# 将编译的结果安装到系统中,需要开root权限
make install

# 查看是否安装成功
gdb -v

补充:一些安装错误

  • 如果提示缺乏GMP,则还需要先安装GMP;
  • 参考博客:https://blog.csdn.net/fenghaoyiqing/article/details/119380183;
  • 有两种安装方式:
  • (1) 直接安装二进制文件:
sudo apt-get install libgmp-dev
  • (2) 通过官网下载压缩包编译安装:
# 安装GMP库依赖
sudo apt-get install m4

# 下载压缩包
mkdir gmp
wget https://gmplib.org/download/gmp/gmp-6.2.1.tar.xz
# 解压
xz -d gmp-6.2.1.tar.xz && tar xvf gmp-6.2.1.tar
cd gmp-6.2.1
# 生成makefile文件
./configure --prefix=/usr  --enable-cxx
# 实际编译代码,生成可执行文件
make
# 将编译的结果安装到系统中,需要开root权限
make install

二、使用

  • 参考:
    • gcc/g++常用编译选项和gdb常用调试命令;

1. 载入可执行文件

gdb xxx(路径/可执行文件名)

2. 查看代码

(gdb) list
# 简写形式
(gdb) l

3. 添加断点

(gdb) break 行数
# 简写形式
(gdb) b 行数
# 查看当前所有的断点
(gdb) info break

4. 运行调试

(gdb) run
# 简写形式
(gdb) r

5. 查看变量值

  • 在运行时才能查看;
(gdb) print 变量名或者表达式
# 简写形式
(gdb) p 变量名或者表达式

6. 添加变量监视

  • 在运行时才能添加变量监视;
  • 当发生了监视变量值修改时,就会自动暂停程序;
    • 相当于是在修改变量值的下一行打了断点;
    • 同时自动打印变量修改的前后值;
(gdb) watch 变量名
# 查看当前所有监视的变量
(gdb) info watch

7. 继续运行程序

  • 在断点暂停之后才能继续运行;
(gdb) continue
# 简写形式
(gdb) c

8. 单步执行

  • 在断点暂停之后才能单步执行;
(gdb) next
# 简写形式
(gdb) n

9. 跳入和跳出函数

  • 在断点暂停之后才能跳入跳出函数;
# 跳入函数
(gdb) step
(gdb) s

# 跳出函数
(gdb) finish

10. 终止当前调试过程

  • 如果想重新从头开始调试,则需要先终止当前调试过程;
# 终止当前调试过程
(gdb) kill
  • 然后就可以用run命令重新从头开始调试;
    • 断点的设置仍在,不需要重新设置;

三、多线程调试

  • 参考:
    • https://www.cnblogs.com/WindSun/p/12785322.html;

1. 多线程断点

  • 仍然是使用break 行号设置断点;
  • 运行到多线程中的任意一个断点,就会阻塞所有线程进入调试;
  • 当前默认的调试线程是发生断点的线程

2. 查看当前所有线程

  • 使用info threads可以查看当前所有线程的信息;
  • 其中:
    • Id是GDB分配给每个线程的序号,一般是按照创建顺序分配的;
      • 主线程通常是1
    • *表示当前正在调试线程序号;
      • 可以通过thread Id切换到其他线程进行调试;
# 查看所有线程信息
(gdb) info threads
  • 一个例子如下:
    查看所有线程信息

3. 切换线程

  • 在断点暂停后可以切换到其他线程进行调试;
  • 首先使用info threads查看当前的线程情况;
  • 然后可以用thread Id切换线程;
# 切换线程
(gdb) thread 线程id

4. 只继续运行当前线程

  • 默认情况下,在断点暂停后执行continue命令是所有线程同时恢复运行的;
  • 但GDB还允许只恢复运行当前调试的线程;
    • 这可以很方便地集中于当前线程的问题处理;
    • 待处理完成后再恢复所有线程的运行;
# 设置只运行当前调试线程
(gdb) set scheduler-locking on
# 只恢复运行当前调试线程
(gdb) continue

# 设置恢复运行所有线程
(gdb) set scheduler-locking off
# 恢复运行所有线程
(gdb) continue

你可能感兴趣的:(Linux,linux,运维,服务器)