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 来进行 调试…