gdb

        在使用gdb调试器之前,必须在编译程序时加上-g选项。

gcc -o build -g test.c
gdb
file build
list
run aaaaaaaaa bbbbbbbbbb
list 1
break 10
run
quit

1、列出源程序 list

不带参数:list

带一个参数:list <line-number>

带两个参数:list <line1, line2>,line1为显示的起始行,line2为结束行。例,“list 2, 6”

======================================================

2、运行程序 run

run <arg1 arg2 ...>。例,“run aaaaaaaaaa bbbbbbbbb”

"show args"            "set args bbbbbbbbb aaaaaaaa"

****************************************************************************************

3、操作断点 break

在源程序中指定的行上设置断点:break <line-number>。通常要和list命令联合使用。

在指定的函数前设置断点:break <function-name>

使用表达式设置断点:break <line-number> if <conditional expression>。用于 当需要知道一个for循环体第n次执行时各变量的值,并在此时使用断点功能使程序暂停运行。<line-number>为设置断点的行号,也可以是函数名。

在指定例程的入口处设置断点:break <filename: line-number> 或 break <filename: function-name>。用于 当程序是由很多源文件构成,则可以在各个源文件中设置断点。

显示当前gdb断点信息:info break

删除指定的断点:delete breakpoint <point-number>。经常与“info break”命令搭配使用。

禁止或启用断点:enable breakpoint <point-number>;disable breakpoint <point-number>。

清除断点:clear,删除程序上次停止处的断点;clear <number>,删除源文件指定行上设置的所有断点。

观察点:watch <condition>。观察点的用法与断点很相似,所有操作breakpoint的命令对watchpoint都适用。但区别在于,断点是在CPU到某一地址取指令时中断,而观察点是在CPU到某一地址读写数据时中断。例:

break 7  // 使用break命令设置断点
watch i==3  // 设置观察点表达式为i==3
delete breakpoint 1  // 删除断点1
continue  // 继续运行程序
设置断点实例:

// <1> 编译程序并生成调试信息
gcc -o build -g test.c

// <2> 执行程序
./build

// <3> 使用gdb调试程序
gdb build
// 或
gdb
file build

// <4> 使用run命令运行程序
run

// <5> 使用list命令列出源程序
list

// <6> 使用break命令设置断点
break 18

// <7> 输入run命令运行程序
run 或 run argv[1] ...

// <8> 使用watch命令设置观察点
watch mystr[len-i]

// <9> 使用next命令来一步步地执行for循环
next

// <10> contiune循环继续执行下去,根据已经设置好的观察点,找出问题所在

// <11> 在gdb下使用shell命令,利用vim修改源文件
shell vi test.c

// <12> 使用shell命令重新编译源文件
shell gcc -g test.c -o build

// <14> 运行程序
run

##############################################################

4、查看运行时数据 print

print <varable-name>

       在gdb中,可以随时查看全局变量(所有文件可见的)、静态全局变量(当前文件可见的)和局部变量(当前Scope可见的)这3种变量的值。如果希望查看全局变量的值或位于其他文件或其他函数的变量值时,可以使用“::”操作符。

print <file::variable>

print <function::variable>。 例,print 'f2.c'::sum::x

对程序中函数的调用:print func(arg1, arg2, ...)。 例,print func(5)

查看表达式的值:print <expression>。例,print a-b

查看数组的值:print <array-name>。例,print a。有时,需要查看一段连续的内存空间的值,如数组的一段,或是动态分配数据的大小。可以使用gdb的@操作符,@的左边是第一个内存的地址的值,@的右边则是需要查看内存的长度。例,程序中有下列一行代码:int *array = (int *)malloc(len * sizeof(int)); 在gdb调试过程中,可以用如下命令显示这个动态数组的取值:p *array@len

变量的输出格式:gdb会根据变量的类型输出变量的值,但也可以自定义gdb的输出格式。例,"break 10" "print/x i"十六进制x

查看内存:examine /nfu <address>。例,从内存地址0x54320读取内容 examine/3uh 0x54320

自动显示变量:display /fmt expr。例,"break 10" "run" "display/x i"十六进制格式x "step"执行下一步(逐行运行代码)

查看所有的局部变量:info locals

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

5、改变程序的执行

修改变量的值:print <expr> 或 set <expr>

跳转执行:jump <location>

信号的产生及处理

强制调用函数

强制函数返回

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

6、gdb高级应用

产生core文件

跟踪栈上数据

绑定运行进程

源文件搜索

机器语言工具:$ip 程序当前运行的指令地址; $pc 程序计数器; $fp 帧指针(当前堆栈帧); $sp 栈指针; $ps 处理器状态

其他调试命令:pwd、cd、quit、shell、show language、info frame 查看当前函数的程序语言、info source 查看当前文件的程序语言

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值