一般来说,GDB 主要帮忙你完成下面四个方面的功能:
1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
3、当程序被停住时,可以检查此时你的程序中所发生的事。
4、动态的改变你程序的执行环境。
使用GDB
一般来说 GDB 主要调试的是 C/C++的程序。要调试 C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点。如:
> cc -g hello.c -o hello
> g++ -g hello.cpp -o hello
如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。
启动GDB的方法有一下几种:
1、gdb <program>
program 也就是你的执行文件,一般在当前目录下。
2、gdb <program> core
用 gdb 同时调试一个运行程序和 core 文件, core 是程序非法执行后 core dump 后产生的文件。
3、gdb <program> <PID>
如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程 ID。gdb 会自动 attach 上去,并调试他。
GDB有一个命令make:
make <make-args>
可以在gdb中执行make命令来重新build自己的程序。
在GDB中运行程序
当以 gdb <program>方式启动 gdb 后,gdb 会在 PATH 路径和当前目录中搜索<program>的源文件。如要确认 gdb 是否读到源文件,可使用 l 或 list 命令,看看 gdb 是否能列出源代码。
在 gdb 中,运行程序使用 r 或是 run 命令。程序的运行,你有可能需要设置下面四方面的事。
1、程序运行参数。
set args 可指定运行时参数。(如:set args 10 20 30 40 50)
show args 命令可以查看设置好的运行参数。
2、运行环境。
path <dir> 可设定程序的运行路径。
show paths 查看程序的运行路径。
set environment varname [=value] 设置环境变量。如:set env USER=hchen
show environment [varname] 查看环境变量。
3、工作目录。
cd <dir> 相当于 shell 的 cd 命令。
pwd 显示当前的所在目录。
4、程序的输入输出。
info terminal 显示你程序用到的终端的模式。
使用重定向控制程序输出。如:run > outfile
调试已运行的程序
一、设置断点(BreakPoint)
我们用 break 命令来设置断点。正面有几点设置断点的方法:
break <function>
在进入指定函数时停住。C++中可以使用 class::function 或 function(type,type)格式来指定函
数名。
break <linenum>
在指定行号停住。
break +offset
break -offset
在当前行号的前面或后面的 offset 行停住。offiset 为自然数。
break filename:linenum
在源文件 filename 的 linenum 行处停住。
break filename:function
在源文件 filename 的 function 函数的入口处停住。
break *address
在程序运行的内存地址处停住。
break
break 命令没有参数时,表示在下一条指令处停住。
break ... if <condition>
...可以是上述的参数,condition 表示条件,在条件成立时停住。比如在循环境体中,可以设
置 break if i=100,表示
当 i 为 100 时停住程序。
查看断点时,可使用 info 命令,如下所示:(注:n 表示断点号)
info breakpoints [n]
info break [n]
二、设置观察点(WatchPoint)
观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马
上停住程序。我们有下面的
几种方法来设置观察点:
watch <expr>
为表达式(变量)expr 设置一个观察点。一量表达式值有变化时,马上停住程序。
rwatch <expr>
当表达式(变量)expr 被读时,停住程序。
awatch <expr>
当表达式(变量)的值被读或被写时,停住程序。
info watchpoints
列出当前所设置了的所有观察点。