- gdb概述
GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。如果是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。
一般来说,GDB主要帮忙你完成下面四个方面的功能:
1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
3、当程序被停住时,可以检查此时你的程序中所发生的事。
4、动态的改变你程序的执行环境。
一个调试demo:
test.cpp
#include "test.h"
int max(int *arr, int len)
{
int max = *arr;
for(int i = 0; i < len; i++)
{
if(*(arr+i) > max)
{
max = *(arr + i);
}
}
return max;
}
int min(int *arr, int len)
{
int min = *arr;
for(int i = 0; i < len; i++)
{
if(*(arr+i) < min)
{
min = *(arr + i);
}
}
return min;
}
main.cpp
#include<iostream>
#include "test.h"
using namespace std;
int main()
{
int n, m;
int arr[10] = {0,1,2,3,4,5,6,7,8,9};
for(int j = 0; j < 10; j++)
{
cout << arr[j]<< endl;
}
cout << "max is = " << (m = max(arr, sizeof(arr)/sizeof(arr[0]))) << " ";
cout << "min is = " << (n = min(arr, sizeof(arr)/sizeof(arr[0]))) << endl;;
return 0;
}
编译生成执行文件:(Linux 下)
[455334@yanfa211_centos6-jk128:weops test]$ g++ -g *.cpp -o test (注意这里要加-g)
使用 GDB 调试:
[455334@yanfa211_centos6-jk128:weops test]$ gdb test
(gdb) l <-------------------- l 命令相当于 list,从第一行开始例出原码。
(gdb) <-------------------- 直接回车表示,重复上一次命令
(gdb) b 14 <-------------------- 设置断点,在源程序第 14 行处。
(gdb) b max <-------------------- 设置断点,在函数 max()入口处。
(gdb) info b <-------------------- 查看断点信息。
(gdb) r <--------------------- 运行程序,run 命令简写
(gdb) n <--------------------- 单条语句执行,next 命令简写。
(gdb) s <--------------------- 单步语句执行,step命令简写。
(gdb) c <--------------------- 继续运行程序,continue 命令简写。
(gdb) p i <--------------------- 打印变量 i 的值,print 命令简写。
(gdb) bt <--------------------- 查看函数堆栈。
(gdb) finish <--------------------- 退出函数。
(gdb) c <--------------------- 继续运行。
(gdb) q <--------------------- 退出 gdb。
启动 GDB 的方法有以下几种:
- gdb program 也就是你的执行文件,一般在当然目录下。
例如:gdb test
- gdb <program> core
用 gdb 同时调试一个运行程序和 core 文件,core 是程序非法执行后 core dump 后产生的文件。
例如:gdb test core.620
- gdb <program> <PID>
如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb 会自动 attach 上去,并调试他。program 应该在 PATH 环境变量中搜索得到。
调试已经运行的程序两种方法:
1. 在 UNIX 下用 ps 查看正在运行的程序的 PID(进程 ID),然后用 gdb
<program> PID 格式挂接正在运行的程序。(ps aux或ps –ef查看进程)
2. 先用 gdb <program>关联上源代码,并进行 gdb,在 gdb 中用 attach
命令来挂接进程的 PID。并用 detach 来取消挂接的进程。
例如:
gdb snake 402
或1.gdb snake 2.attach 402
GDB 启动时,可以加上一些 GDB 的启动开关,详细的开关可以用 gdb -help查看。
gdb的命令很多,gdb 把之分成许多个种类。help 命令只是例出 gdb 的命令种类,如果要看种类中的命令,可以使用 help <class> 命令,如:help breakpoints,查看设置断点的所有命令。也可以直接 help <command>来查看命令的帮助。
gdb 中,输入命令时,可以不用打全命令,只用打命令的前几个字符就可以了,当然,命令的前几个字符应该要标志着一个唯一的命令,在 Linux 下,你可以敲击两次TAB键来补齐命令的全称,如果有重复的,那么 gdb 会把其例出来。
调试 C++的程序时,可以函数名一样。如:
(gdb) b 'bubble( M-?
bubble(double,double) bubble(int,int)
(gdb) b 'bubble(
你可以查看到 C++中的所有的重载函数及参数。(注:M-?和“按两次 TAB 键”是一个意思)
要退出 gdb 时,只用发 quit 或命令简称 q 就行了。