GDB常用调试命令(Linux)

首先我们要知道程序的发布方式有两种:debug模式和release模式 Linux gcc/g++出来的二进制程序,默认是release模式 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项.

一.最简单的调试方式:就是让程序停在一个位置然后使用printf输出一些相关的需要查看的变量的值,因此我们可以在程序中感觉存在问题的位置加上printf以此来进行调试,但是这种方式太过麻烦了,所以我们使用GDB来进行调试十分方便,其根本原理也相似.

二.进入方式:在使用gcc进行编译时加上-g进入debug模式,再使用gdb+filename,进入调试.使用ctrl + d 或 quit可以退出调试.

三.常用的一些命令:

list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。

list/l 函数名:列出某个函数的源代码。

r或run:运行程序。

n 或 next:单条执行。

s或step:进入函数调用

break(b) 行号:在某一行设置断点

break 函数名:在某个函数开头设置断点

info break :查看断点信息。

finish:执行到当前函数返回,然后挺下来等待命令

print(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数

p 变量:打印变量值。

set var:修改变量的值

continue(或c):从当前位置开始连续而非单步执行程序

run(或r):从开始连续而非单步执行程序

delete breakpoints:删除所有断点

delete breakpoints n:删除序号为n的断点

disable breakpoints:禁用断点

enable breakpoints:启用断点

info(或i) breakpoints:参看当前设置了哪些断点

display 变量名:跟踪查看一个变量,每次停下来都显示它的值

undisplay:取消对先前设置的那些变量的跟踪

until X行号:跳至X行

breaktrace(或bt):查看各级函数调用及参数

info(i) locals:查看当前栈帧局部变量的值

quit:退出gdb

四,基本方法的使用:

a.首先我们需要让程序停在某些位置,那么就需要加断点,使用(b+行号)对某些行设置断点,如果不知道要在哪里进行设置可以使用list对相关行进行查看,(l+行号)是以改行为中心打印十行,(l+函数名)可以查看函数中的所有代码,(r)可以直接运行程序,当我们使用(l)查看原代码的时候按回车可以继续向下进行查看.

b.加断点后查看断点信息(info b),清除该行断点(clear),调试中我们在使用r跑起来之后直接使用continue跑到下一个断点.这里有非常重要的三个指令一定牢记:(1)单步执行不进入函数next,(2)单步执行进入函数step,(3)终止正在调试的程序kill.

c.查看动态数组时使用(p *arrayname(数组名)@len(数组长度)) ,@的左边是数组的首地址,也就是该数组array所指向的内容,右边则是数据的长度,即可以使用该命令查看数组中的所有元素.静态数组直接使用(p+数组名)便可查看.

d.查看程序中的变量的值,我们可以查看的变量有三种:

(1)全局变量(所有文件)
(2)静态全局变量(当前文件)
(3)局部变量(当前代码段)

需要注意的是当我们的局部变量和全局变量重名时程序运行到局部变量所在的代码段时直接查看所显示的是局部变量的值(查看方式依然是:p+变量名),此时如果想要查看全局变量的值,则需要在变量名前加上::,便可以查看该名字的全局变量的值.

e.查看地址中的内容:(x/)
n 表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容.
f 表示显示的格式.
u 表示从当前地址往后请求的字节数(默认四字节).

例:x/4uh 0x12121212   4就为n的位置表示4个单位,u就为f的位置以16进制显示,h就为u的位置代表双字节(每个单位).

只要掌握上面这些常用的gdb命令便可以进行一些基本的调试了.

五.GDB的数据显示格式:
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。

例:查看变量num的值:p num(默认十进制) ,然后p/x  num,便会显示num的16进制的值.

猜你喜欢

转载自blog.csdn.net/weixin_49312527/article/details/122029443