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,设置优点
利用行号�O置断点
(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