gdb 调试

本文详细介绍了GDB调试器的使用方法,包括如何编译带调试信息的程序,启动GDB的TUI界面,以及一系列常用的调试命令,如run、continue、next、step、until、finish等。此外,还讲解了查看内存、修改变量值、查看堆栈信息、设置断点、打印变量类型等功能。通过实例展示了如何在GDB中高效地进行程序调试。
摘要由CSDN通过智能技术生成

gdb 调试

编译:加上 -g 参数…
g++ main.cpp -g -std=c++11
启动 gdb

–tui 启动 图形界面

gdb a.out --tui

这种界面看起来 还是挺舒服的…
在这里插入图片描述
带有 tui 参数的调试,有个问题,要自己手动的窗口刷新
ctrl+l可以刷新窗口,可以避免调试时屏幕混乱
当窗口大小变化而gdb tui窗口未随之变化时,这时候随便输入一下就会刷新过来了,亲测使用ctrl+l刷新后有时会导致显示消失

常用指令:

run:简记为 r ,其作用是运行程序,当遇到断点后,程序会在断点处停止运行,等待用户输入下一步的命令。
continue (简写c ):继续执行,到下一个断点处(或运行结束)
next:(简写 n),单步跟踪程序,当遇到函数调用时,也不进入此函数体;此命令同 step 的主要区别是,step 遇到用户自定义的函数,将步进到函数中去运行,而 next 则直接调用函数,不会进入到函数体内。
step (简写s):单步调试如果有函数调用,则进入函数;与命令n不同,n是不进入调用的函数的
until:当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体。
until+行号: 运行至某行,不仅仅用来跳出循环
finish: 运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息。
call 函数(参数):调用程序中可见的函数,并传递“参数”,如:call gdb_test(55)
quit:简记为 q ,退出gdb

gdb中查看内存的方法总结:使用examine命令(简写是x)来查看内存地址中的值。x命令的语法如下:

查看内存

x/<n/f/u><addr>

所以查看十进制地址的方法即为:
**(gdb) x/9db 0x00001fa4 **```从内存地址0x00001fa4读取内容,b表示以单字节为一个单位,9表示九个单位,d表示按十进制显示。 还有另外一种方法是直接print,由于0xBFFFFAA0是指针的指针所指向的地址,所以查看其内容即为

x/4xb &len 从len的首地址开始, 打印4个字节, 以16进制的形式。

打印

print 打印变量、字符串、表达式等的值,可简写为p

p count 打印count的值
p cou1+cou2+cou3 打印表达式值
print接受一个表达式,GDB会根据当前的程序运行的数据来计算这个表达式,表达式可以是当前程序运行中的const常量、变量、函数等内容。但是GDB不能使用程序中定义的宏


改变程序的执行

可以修改正在运行变量的值。
修改变量的值:

 (gdb) print x=4
还有种改法:
 (gdb) set var width=47
这样的话 width 就被我们主动的设置了为  47 ...

查看堆栈信息 bt

breacktrace,简称bt
打印当前的函数调用栈的所有信息。如

1 (gdb) bt
2 #0 func (n=250) at tst.c:6
3 #1 0x08048524 in main (argc=1, argv=0xbffff674) at tst.c:30
4 #2 0x400409ed in __libc_start_main () from /lib/libc.so.6

#0: 当前的函数. mergsort
#1 : main 函数.
main 函数 里面调用了 mergsort
在这里插入图片描述

栈的回朔…

从上可以看出函数的调用栈信息:__libc_start_main –> main() –> func()

自动显示

display expr

断点设置

1:条件断点

b demo:79 if i==900

# 为函数断点设置条件
# void cond_fun_test(int a,const char *str)
b cond_fun_test if a==10

跳出 循环

until +行号,跳出这个循环

在这里插入图片描述

查看地址

p &a : 看变量的地址…

在这里插入图片描述

GDB查看变量类型

参考
https://www.cnblogs.com/qiumingcheng/p/15812667.html

这个写的还是挺详细的…
https://www.cnblogs.com/taolusi/p/9293290.html

ptype

ptype :和whatis类似,用于显示数据类型,但是它还可以显示typedef定义的类型等。使用格式:
ptype 变量或表达式
在这里插入图片描述### 打印结构体

set print pretty on
GDB 打印数组索引
set print array-indexes on

怎么 在 运行中 设置 string 类型的 变量…

print name.operator=(“bob”)
这样的话,就把 name 这个 string 类型的变量设置为了 bob。

后面有时间记录下 怎么在android 设备上用 gdb 来进行 调试…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值