1. gdb编译:
g++ -Wall -g -o study_cpp study_cpp.cpp
-g代表保留编译信息
2. gdb运行
gdb study_cpp
3. 设置命令行参数,即设置main函数的输入参数
set args a b c d e f g
相当于main函数的argc = 8, args[0] = “a”……
4. 显示命令行参数
show args
不人为set args 时,直接show args则结果显示为空:
Argument list to give program beingdebugged when it is started is "".
如果如第三条那样set之后,则show的结果就是:
Argument list to give program beingdebugged when it is started is "a b c d e f g".
5. 程序执行
a) 不带输入参数(命令行参数)
run
注意:run后面不用加程序名!!原因很简单,我们进入gdb的时候已经写程序名了,run的是哪个程序是不言自明的!
如果之前有用set args进行设置,则此时的输入参数即为set args时写进去的参数
b) 带输入参数
run a b c d e f g
则a b c d e f g就成为study_cpp里main函数的args输入参数
注意:同样不用写程序名。即便之前有用set args设置输入参数,此处也会按照我们新写的参数进行。之前的设置失效。
6. 设置变量的值
a) 改变gdb环境里的临时变量的值。这个是是gdb环境里的,而不是程序里的。
set $var_name = 3
注意:gdb临时变量总是以$开头,此变量只能在gdb环境中使用,且使用的时候也必须以$开头,即比如要打印我们刚刚设置的临时变量的值,不能用:
print var_name
而必须写:
print $var_name
b) 改变程序里变量的值:
set variable var_name = 5
很明显,gdb用是否以$开头来将gdb环境里的临时变量与程序里的变量区分开来。但是,如果程序里的变量就用$开头会怎么样?
打印$j并没有打出来。
可见,程序里最好不要用以$开头的变量,虽然C语言并没有明令禁止。
7. gdb里的循环语句
(gdb) set $i = 0
(gdb) set variable p = argv[$i]
(gdb) while p != 0
>print p = argv[$i++]
>end
执行的结果是:
注意$i++和while的用法
8. 在某一断点处持续执行一系列命令
前提:设置断点
(gdb) break 81
Breakpoint 2 at 0x400ae1: file test.cc,line 81
开始:以command nr开头,以end结尾,中间的命令就是执行到断点处自动执行的命令,其中nr是断点的编号。
例子如下:
(gdb)commands 2 //命令开始
Typecommands for breakpoint(s) 2, one per line.
Endwith a line saying just "end".
>silent //关闭gdb的自动输出
>set$p = obj //设置gdb临时变量
>while$p != 0 //遍历链表
>print $p->name
>set $p = $p->next
>end
>continue //跳过断点,继续执行
>end //命令结束
输入run,运行:
9. 查看内存处的内容
x /<fmt> <ADDRESS>
其中:
a) ADDRESS可以是任何合法的地址表达式,如0X8799f00, p(指针), &var
b) fmt由三个部分组成,NFU:
1) N,表示查看的长度;
2) F,表示格式,同print命令
3) U,表示单位,可以是b(字节) h(半字,两个字节) w(字,4个字节) g(双字,8个字节)
例:
(gdb) x /10cb argv[0]
以字节为单位,10个字节,用字符格式显示