当以 gdb <program>方式启动 gdb 后,gdb 会在 PATH 路径和当前目录中搜索<program>的源文件。如要确认 gdb 是否读到源文件,可使用 l 或 list 命令,看看 gdb 是否能列出源代码。没有搜索到可以在gdb中通过dir命令设置源码搜索路径。
1 run之前可能要做的事情
在 gdb 中,运行程序使用 r 或是 run 命令。程序的运行,你有可能需要设置下面四方面的事。
- 程序运行参数
set args 可指定运行时参数。(如:set args 10 20 30 40 50)
show args 命令可以查看设置好的运行参数。 - 运行环境
path <dir> 可设定程序的运行路径。
show paths 查看程序的运行路径。
set environment varname [=value] 设置环境变量。如:set env USER=hma
show environment [varname] 查看环境变量。 - 工作目录
cd <dir> 相当于 shell 的 cd 命令。
pwd 显示当前的所在目录。 - 程序的输入输出
info terminal 显示你程序用到的终端的模式。
使用重定向控制程序输出。如:run > outfile
tty 命令可以指写输入输出的终端设备。如:tty /dev/ttyb
2 暂停/恢复程序运行
调试程序中,暂停程序运行是必须的,GDB 可以方便地暂停程序的运行。可以设置程序的在哪行停住,在什么条件下停住,在收到什么信号时停往等等。以便于查看运行时的变量,以及运行时的流程。
当进程被 gdb 停住时,可以使用 info program 来查看程序的是否在运行,进程号,被暂停的原因。在 gdb 中,我们可以有以下几种暂停方式:断点(BreakPoint)、观察点(WatchPoint)、捕捉点(CatchPoint)、信号(Signals)、线程停止(Thread Stops)。如果要恢复程序运行,可以使用 c 或是 continue 命令。
2.1 设置断点(BreakPoint)
正面有几点设置断点的方法:
- break <function>
在进入指定函数时停住。C++中可以使用 class::function或 function(type,type)
格式来指定函数名。
- break <linenum>
在指定行号停住。 - break + offset or break - offset
在当前行号的前面或后面的 offset 行停住。offiset 为自然数。 - break filename:linenum
在源文件 filename 的 linenum 行处停住。 - break filename:function
在源文件 filename 的 functio