1,在编译时使用-g选项,或-ggdb,且最好先不要优化,方便调试.


2,建议发布的程序时(二进制),那么不要去掉调试符号,方便自己和用户。


3,使用程序名和内存转储文件core作为参数启动GDB.


$ gdb debugme core


4,-q选项使gdb启动时不显示许可信息,


  运行程序的命令run


  程序运行的shell环境由$SHELL值来决定


  set 和 unset 命令设置或取消参数和环境变量。 set args arg1 arg2


set environment env1 env2


5,backtrace命令以生成导致段错误的函数树


6,list[m,n] m和n是包含初次错误的首次出现代码段的起始行和结尾行的行号。不


带参数则会显示附近的10行代码。


7,print 打印程序表达式,变量或数组。


print i


print ary[i]


print $1 -1


print ary@10 打印从ary开始的头10个内存区域


print ary[1]@5 打印从ary第一个元素值到第五个元素值。


8,设置优点


利用行号設置断点


(gdb) break linenum          


(gdb) break filename:linenum


利用函数名设置数点


(gdb) break funcname


(gdb) break filename:funcname


条件断点


(gdb) break linenum if expr


(gdb) break funcname fi expr


9,检查,更新运行中代码


whatis i :命令指出参数i类型。


ptype S: 显示S结构。


set variable varname = value


10,用于函数的命令


call name(args) 调用并执行名为name,参数为args的函数


finish 如果可以,则中止当前函数并打印它的返回值。


return value 停止执行当前函数,并将value 返回给调用者。


11,活动的变量定义:


1,如果函数(称作控制函数)正在执行或该函数将控制流程交给一个由控制函


数调用的函数,那么该函数里的局部变量处于活动状态。如函数foo调用函数bar,


只要bar在执行,所有的foo和bar的局部变量处于活动状态。一量bar返回,就只有


foo函数的局部变量是活动的,从而只有foo的局部变量能被访问。


2,全局变量不管程序是否运行总是活动的。


3,非全局变量是非活动的,除非程序运行。



静态变量活动范围不会超过所在的文件中,是局部的,这样访问一个静态变量要指


明文件名


file::varname


funcname::varname


  如:


(gdb) print 'foo.c'::baz


打印整型变量idx在两个函数中的地址


(gdb) print &blat::idx


(gdb) print &aplat::idx


12,用-d开关告诉GDB去×××源文件,即如果有源代码不在当前工作目录或程序编


译目录,用不用-d<路径名>启动gdb.


$gdb -d /source/project1 -d /oldsource/project1 -d /home/scr killerapp


13,查找字符串,从当前执行处开始。


search<字符串> 向后查找第一个出现的。


reverse-search <字符串> 反向查找字符串。


14,与Shell进行通信。


(gdb) shell command


如 :   (gdb) shell pwd


15,附加到某个运行的程序


*启动gdb时第二个参数变为要附加的可执行程序的PID(而不再是core)


如 : $ gdb /usr/sbin/httpd 728


*利用file和attach命令。


对上例等价为:


(gdb) file /usr/sbin/httpd


(gdb) attach 728