
一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点。如:
$gcc -g -Wall hello.c -o hello
$g++ -g -Wall hello.cpp -o hello
如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。当你用-g把调试信息加入之后,并成功编译目标代码以后,让我们来看看如何用gdb来调试他。
启动GDB的方法有以下几种:
gdb <program>
program也就是你的执行文件,一般在当前目录下。
gdb <program>core
用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。
gdb <program><PID>
如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。
以上三种都是进入gdb环境和加载被调试程序同时进行的。也可以先进入gdb环境,在加载被调试程序,方法如下:
*在终端输入:gdb
*在gdb环境中:file <program>
这两步等价于:gdb <program>
GDB启动时,可以加上一些GDB的启动开关,详细的开关可以用gdb -help查看。我在下面只例举一些比较常用的参数:
-symbols <file>
-s <file>
从指定文件中读取符号表。
-se file
从指定文件中读取符号表信息,并把他用在可执行文件中。
-core <file>
-c <file>
调试时core dump的core文件。
-directory <directory>
-d <directory>
加入一个源文件的搜索路径。默认搜索路径是环境变量中PATH所定义的路径。
1、file载入调试程序,同时加载符号表
2、core-file
载入core dump程序映像,
gdb命令行参数形式: (-c | -core) core-file
3、symbol-file
从指定文件载入符号表
gdb命令行参数形式: (-s | -se | -symbols) symbol-file
4、directory
添加源文件搜索路径
gdb命令行参数形式: (-d | -directory) source-directory
5、r — run
启动调试程序,可传入参数
6、c — continue
跳过断点继续执行
7、s — step
单步执行,进入子程序内部
8、n — next
单步执行,越过子程序执行
9、b — break
设置断点,使用行号或函数名
10、i — info
显示断点info breakpoints
11、d — delete
删除断点delete breakpoints
12、bt — backtrace
打印栈帧
13、p — print
打印变量
/x 按十六进制格式显示变量
/d 按十进制格式显示变量
/u 按十六进制格式显示无符号整型
/o 按八进制格式显示变量
/t 按二进制格式显示变量
/a 按十六进制格式显示变量
/c 按字符格式显示变量
/f 按浮点数格式显示变量
14、l — list
显示程序源码
15、jump
跳转到第n行处开始调试
16、call
调用函数
17、finish
退出当前函数返回到它的调用函数
18、watch
设置观察点,当表达式的值改变时停止运行
19、awatch
设置观察点,当表达式的值被读取或发生改变时停止运行
20、commands
设置当遇到断点n时执行的特定动作命令
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)