写在前面
一、安装GDB
mkdir gdb
cd gdb
wget http://ftp.gnu.org/gnu/gdb/gdb-13.1.tar.gz
tar -zxf gdb-13.1.tar.gz
cd gdb-13.1
./configure
make
make install
gdb -v
补充:一些安装错误
sudo apt-get install libgmp-dev
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
./configure --prefix=/usr --enable-cxx
make
make install
二、使用
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
三、多线程调试
1. 多线程断点
- 仍然是使用
break 行号
设置断点; - 运行到多线程中的任意一个断点,就会阻塞所有线程进入调试;
- 当前默认的调试线程是发生断点的线程;
2. 查看当前所有线程
- 使用
info threads
可以查看当前所有线程的信息; - 其中:
Id
是GDB分配给每个线程的序号,一般是按照创建顺序分配的;
*
表示当前正在调试线程序号;
- 可以通过
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