共计 1617 个字符,预计需要花费 5 分钟才能阅读完成。
GDB 是什么
GDB 是 linux 环境下的一般功能强大的调试器,用来调试 C 或 C++ 写的程序。它可以做这些事情
Start your program, specifying anything that might affect its behavior.
Make your program stop on specified conditions.
Examine what has happened, when your program has stopped.
Change things in your program, so you can experiment with correcting the effects of one bug and go on to learn about another.
安装
以 centos 7 为例,安装 GDB-8.2.1 版本
安装依赖
C++ 11 编译器和 GUN make 是 GDB 必要的工具包,需先安装他们。
yum install gcc*
— 或者为了省事,直接把开发常用的工具包都安装了
yum group install “Development Tools”
— 查看是否安装成功
gcc -v # 需 4.8 以上版本
gun make 官网地址
安装 GDB
在官网上找到官方的 FTP 仓库,下载最新的版本,解压后开始安装
./configure –prefix=/usr/local/gdb821
make && make install
安装完成将 /usr/local/gdb821/bin 添加到 PATH 环境变量
— 也可以直接用 yum 安装
yum install -y gdb
安装需要花比较久时间,可以洗个澡干点爱干的事。
gdb -v
使用示例
一个简单的示例,运行一个 PHP 脚本 gdb_test.php
<?php
for($i = 0; $i < 10; $i++){
if(in_array($i,[1,9,20])){
echo $i*$i,PHP_EOL;
}
}
开始调试
gdb php
> run /usr/local/src/gdb_test.php
这样脚本就执行成功了,实验了第一个命令。
后续再详细学习断点,单步调试等真正的实验。
附:GDB 常用命令
backtrace:显示栈信息。简写为 bt。
frame x 切换到第 x 帧。其中 x 会在 bt 命令中显示,从 0 开始。0 表示栈顶。简写为 f。
up/down x 往栈顶 / 栈底移动 x 帧。当不输入 x 时,默认为 1。
print x 打印 x 的信息,x 可以是变量,也可以是对象或者数组。简写为 p。
print */&x 打印 x 的内容 / 地址。
call 调用函数。注意此命令需要一个正在运行的程序。
set substitute-path from_path to_path,替换源码文件路径。当编译机与运行程序的机器代码路径不同时,需要使用该指令替换代码路径,否则你无法在 gdb 中看到源码。
break x.cpp:n 在 x.cpp 的第 n 行设置断点,然后 gdb 会给出断点编号 m。命令可简写为 b。后面会对 break 命令进行更详细的解释。
continue 继续运行程序。进入调试模式后,若你已经获取了你需要的信息或者需要程序继续运行时使用。可简写为 c
until 执行到当前循环完成。可简写为 u
step 单步调试,步入当前函数。可简写为 s
next 单步调试,步过当前函数。可简写为 n
finish 执行到当前函数返回
set var x=10 改变当前变量 x 的值。也可以这样用:set {int}0x83040 = 10 把内存地址 0x83040 的值强制转换为 int 并赋值为 10
info locals 打印当前栈帧的本地变量
jump 使当前执行的程序跳转到某一行,或者跳转到某个地址。由于只会使程序跳转而不会改变栈值,因此若跳出函数到另外的地方 会导致 return 出错。另外,熟悉汇编的人都知道,程序运行时,有一个寄存器用于保存当前代码所在的内存地址。所以,jump 命令也就是改变了这个寄存器中的值。于是,你可以使用“set $pc”来更改跳转执行的地址。如:set $pc = 0x485
return: 强制函数返回。可以指定返回值