使用 GDB
一般来说 GDB 主要调试的是 C/C++的程序。要调试 C/C++的程序,首先在编译时,我们必须
要把调试信息加到可执行文件中。/gcc/g++)的-g 参数可以做到这一点。
如:
> cc -g -o hello
> g++ -g -o hello
如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。当你
用-g 把调试信息加入之后,并成功编译目标代码以后,让我们来看看如何用 gdb 来调试他。
进入 GDB
启动 GDB 的方法有以下几种:
1、gdb program
program 也就是你的执行文件,一般在当然目录下。
2、gdb program core
用 gdb 同时调试一个运行程序和 core 文件,core 是程序非法执行后 core dump 后产生的文
件。
3、gdb pid
如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程 ID。gdb 会自动
attach 上去,并调试他。program 应该在 PATH 环境变量中搜索得到。
GDB 启动时,可以加上一些 GDB 的启动开关,详细的开关可以用 gdb -help 查看。我在下面
只例举一些比较常用的参数:
参数说明
-symbols [file](-s) 读取文件中的符号表
-exec [file] (-e) 调试一个可执行文件
-se [file] 上二者的缩写
-core [file](-c) 读入一个 core dump 文件
-pid number (-p) 启动 attach 模式,除错一个执行中的行程。number
是目标行程的 pid
-directory [directory] (-d) 将 directory 加入原始码的搜寻路行
-readnow (-r) 一次读取完所有的符号表,这会让启动 gdb 的时间
变长,但在执行往后的除错动作会较快速。
下列还有部分选择性的参数,我列出几个目前用的到的:
-quiet -silent -q 安静模式,启动时 gdb 将不会显示版权页。
-windows -w 与下一选项相反,这会启动 GUI
-nowindows -nw 如果 gdb 有编入 GUI 的话,这个选项会关掉它。
-cd [directory] 切换工作目录为 directory 而不是现在的目录
-tty [device](-t) 指定 device 为程式的标准输出入
--args 这个参数要当作命令列的最后一个参数,其后跟随
的参数都会被视为「欲传给将调试的程序的参数」
当然我们也不一定要在启动时指定调试来源。
file 指令可以指定要调试的程序,功能就与-se 一样,其实这样指定是比较方便的。在执
行程序前,我们可以先指定命令列参数,如同--args 参数的效果。
程序运行参数
set args 指定运行时的命令列参数
show args 查看现在的命令列参数是什么。由于 gdb 调试的对象是已经编译好的可执行文
件,所以这里我们不必像 一样等半天。有一点必须注意,gdb 传给程序的命令列参数
是程序开始执行前的那一份命令列参数,如果程序已经开始执行,就算用中断点中断执行然
后改变命令列参数,也只会在下一次执行时变更才会生效。
运行环境
path 设定程序的运行路径。
show paths 查看程序的运行路径。
set environment varname [=value] 设置环境变量,如 set env USR =
show environment [varname] 查看环境变量。
工作目录
cd 相当于 shell 的 cd 命令。
Pwd 显示当前的所在目录。
程序的输入输出
info terminal 显示你程序用到的终端的模式。
使用重定向控制程序的输出。如:run > outfile
tty 命令可以指定写输入输出的终端设备。如:tty /dev/ttyb
调试已运行的程序两种方法:
1、在 UNIX 下用 ps 查看正在运行的程序的 PID(进程 ID),然后用 gdb PID 格式挂接正在
运行的程序。
2、先用 gdb 关联上源代码,并进行 gdb,在 gdb 中用 attach 命令来挂接进程的 PID。并用
detach 来取消挂接的进程。
暂停/ 恢复程序运行
我们在调试的过程中,会推测某些代码是否出了问题,如果要测试该段代码,可以让程序执
行到那区段前暂停,然后我们来测试看看是出了什么问题。
一、设置断点(BreakPoint)
参数说明
brea
GDB中文手册 来自淘豆网m.daumloan.com转载请标明出处.