第一步,编译生成带源代码调试符号的可执行文件:
gcc –o hello –g hello.c
其中-g的意思是生成带源代码调试符号的可执行文件hello,不使用-g进行编译的可执行文件也可以使用gdb调试,但是缺少部分调试信息(如行号、函数名等)。调试信息包括用户程序里的每个变量的类型和在可执行文件里的地址映射以及源代码的行号。

第二,使用gdb hello进入gdb,进行调试阶段。启动gdb有以下几种方式:
gdb filename        //指定要调试的程序
gdb filename core    //指定要调试的程序及其coredump文件
gdb filename pid    //指定要调试的程序及对应进程id号
可以使用命令行参数更加详细地控制gdb的行为:
-silent            //不显示进入gdb开头的提示信息
-help(h)        //命令行辅助信息
-se file        //从file中读取符号,并作为可执行文件
-core(c) file        //指定core dump文件file
-c id            //连接到进程号为id,与attach命令相似
-x file            //file中存放一系列的gdb命令,执行file中的gdb命令
-symbols(s)        //从file中读取符号,但不作为可执行文件
-directory(d) path    //指定路径path,将path加入到搜索源文件的路径中
注意:gdb开始运行时,它把任何一个不带选项前缀的参数都当作一个可执行文件或core文件或进程号,具体为:把第一个前面没有选项说明的参数看作加了-se选项,而第二个看作是跟着-c选项后面。在gdb中可以把选项名掐头去尾,只要保证gdb能唯一判断是哪个选项就行。

第三,逐步调试,部分命令如下:
break(b) [file:] func / line / addr / +num / -num    //某函数、某行或者某内存地址处设断点,可同时设置多个断点
break args if COND                    //COND非零时在args处中断
tbreak agrs                        //断点只有效一次
clear 
[file:] func / line / addr / +num / -num        //清楚某种断点,可同时清除多个
delete(d) breaknum                    //使用断点号来清除断点或观察点,没有参数则清除所有断点
disable(dis) breaknum                    //禁止……
enable 
[once] breaknum                    //启用或者仅启用一次……
--------------------------------
watch expr            //expr值改变时停止程序,用于捕获错误很有效
run(r) arg            //从头开始运行程序,并以arg作为参数(可多个)
continue(c)            //继续被中断的程序,不能用作程序的运行启动
step(s)                //单步进入,跟踪到函数内
next(n)                //单步,不进入函数内
list(l)                //显示源代码(正在执行区域附件10行)
backtrace(bt) / where(w)    //显示函数栈的内容
print(p) expr            //查看变量或者表达式的值
display expr            //每次中断时,显示expr的值
undisplay 
[expr]        //取消display,没有参数的话则取消全部
whatis expr            //显示expr的资料形态,例如变量类型等
------------------------------
set width 
70            //设置屏幕列数
quit(q)                //终止退出
kill(k)                //终止正在调试的程序,但不退出调试,可重来
file                //装入想要调试的可执行文件
shell command            //在gdb中直接运行shell命令且不需要退出gdb
help command            //command命令说明
complete arg            //列出所有arg开头的命令
Esc + Shift + ?            //查看所有命令的列表
------------------------------
attach pidat pid        //接上一个执行的进程pid,这会使pid暂停,中断任何sleep以及可中断的系统调用
detach pid            //解除目前接上的进程pid
jump address            //跳到指定的内存位置,并开始执行
make filename            //不退出gdb就能重新产生可执行文件
注意:
(1)有的命令后面可以跟参数,例如step接受一个参数表示单步执行多少步;有的命令不接受任何参数。
(2)空行表示重复上一个命令;有的命令不可重复,例如run;还有一些重复后会产生严重后果,建议不使用空行重复。
(3)可以使用gdb的info(i)和show命令来查询程序状态,每个命令可以查询一系列的状态,具体如下:
info:
info breakpoints           //查看断点情况
info args                       //查看程序参数
info display                  //查看所有display
info stack                    //查看函数栈内容,与backtrace相同
info watchpoints          //查看观察点
show:
show version              //显示gdb版本号
show copying             //显示版权信息
set:
set命令用来为程序设置运行环境,比如可以用set prompt $ 来把gdb提示符设置为$。使用set命令可以改变绝大多数show显示的信息。

第四,调试完成后,可以使用strip命令删除那些带有-g选项的C编译程序所生成的信息,释放一些磁盘空间。
strip命令减少XCOFF对象文件的大小,strip命令从XCOFF对象文件中有选择地除去行号信息、重定位信息、调试段、注释段、文件头以及所有或部分符号表。一旦使用该命令,则很难调试文件的符号,因此通常只在已经调试和测试过的生成模块上使用strip命令。
/usr/binstrip [选项] file 
strip的具体选项信息在这里不作总结。