gdb常用调试命令

写该文章仅为记录学习到的重点,留作以后复习作为参考。

代码历经四步才能生成可执行文件:
1.预处理,如:g++ -E ***.cpp -o ***.i 这里做宏展开。
2.编译, 如: g++ -S ***.i -o ***.s 这里是语法编译。
3.汇编, 如: g++ -c ***.s -o ***.o 这里是生成汇编代码。
4.链接, 如:g++ ***.o -o Obj 这里是生成目标文件。

在gcc/g++编译器编译过程中,使用-g选项会向目标文件"插入"调试符号,这样使用gdb可以读取调试符号,从而达到调试的目的。

在以下叙述中 目标文件全是由 gcc/g++ -g 生成了可以供gdb调试的。

直接调试目标程序 gdb file
附加进程 gdb attach 进程 ID
调试 core 文件 gdb filename corename

core文件默认是不会生成的,ulimit -c/ulimit -a 命令查看core文件生成与否,值为0不自动生成, 终端命令行 ulimit -c unlimited 打开生成coredump,但是终端关闭则后台程序仍然不会生成coredump,s在/etc/profile最后一行添加ulimit -c unlimited 则永远生成coredump文件。

break命令:
break functionname,在函数名为functionname的入口处添加断点;
break lineno,在当前文件行号为lineno处添加断点;
break filename:lineno,在文件名filename行号lineno处添加断点;

backtrace命令:
查看函数调用栈(即 到该断点过程中的函数调用过程);

frame命令:
切换函数调用栈帧,与backtrace命令配合使用可以回溯函数调用;

info break命令:
查看之前添加了的断点信息;

disable/enable命令:
disable/enable 断点编号 禁用/启用编号为?的断点;
如果disable或enable 不加断点编号,那么禁用或者启用所有断点;

delete命令:
delete 断点编号 删除某个断点;
delete 不加断点编号 则删除所有断点;

list命令:
查看当前断点附近的代码; 比如 frame 0 后 list 查看0栈帧附近的代码。
list + / list - 可以往前/ 往后显示代码;
list命令的其他用法参见help list 查看功能;

print命令:
print 可以打印变量地址,变量值,对象的各个成员的值,变量的相加等,执行函数并取得返回结果;
print 还可以修改变量的值;比如有变量 a, print a = 100;
print打印非常长的字符串是会打印不完全,set print element 0即可;

ptype命令:
ptype 意思是“print type” 打印变量类型;

info命令:
info命令是个组合命令,搭配其他命令使用;如 info break,info thread…等;
info arg 打印函数参数;
更多使用方法参见 help info查看;

thread命令:
thread 线程ID 直接切换到指定线程运行;之后bt显示为该线程调用堆栈;

next命令:
单步执行程序(step over),执行一行语句,语句为函数不会进入函数执行;

step命令:
单步步入(step into), 遇到函数语句会进入函数执行;

return命令:
return 返回值,使得正在执行的函数从当前语句直接返回到该函数调用点,这样函数后面的代码段就不会被执行;

finish命令:
finish命令也是结束函数执行与return作用一样,但是finish会让函数后面代码被自动执行一次,完成函数调用才返回调用点;

until命令:
可以指定程序运行到某一行停下;相当于 break n ,输入continue执行到n行;

jump命令:
jump location,程序跳至指定的location(行号或者函数的地址)位置;
若location后无断点,那么程序将按照逻辑往后执行;

disassemble命令:
查看代码的汇编指令集,命令会使得执行代码反汇编并显示出来;

set args / show args命令:
在gdb附加进程后和run之前,用set args为进程执行添加参数,如果后面跟多 个参数则可以 set args “a” “c” 这样便可以了;
如果想清理掉之前添加的参数,set args 后边什么都不写就ok了;
show args 显示执行附加进程执行时所传入的参数;

tbreak命令:
temporarily break,临时断点 当程序触发该断点一次之后会自动被删除;

watch命令:
监视一个变量或者一段内存,当值被修改时gdb就会自动中断下来;

display命令:
display 变量, 该命令监视的变量或内存,内次程序中断下来都会输出其值;

让被GDB调试的程序接收信号:
由于调试过程中ctrl+c 信号被gdb接收,若是想让附加程序接受信号则如下:
1.在gdb使用signal手动给进程发送信号,如:signal SIGINT
2.改变gdb接收信号处理的设置,通过handle SIGINT nostop print告诉GDB在 接收到SIGINT的时候不要停止,并把信号传递给调试的目标程序;

多线程下禁止线程切换:
由于cpu调度多线程时会分配给每个线程一定的时间片,当线程cpu时间片执行结束后就会进入睡眠状态,因此在线程函数中加入断点并执行或用until命令指定线程执执行的行后,线程并不一定执行到指定地方就会停止,因此gdb提供了禁止线程切换的命令 set scheduler-locking on锁定当前线程,不会出现上述的情况;另外还提供了关闭线程禁止切换命令 set scheduler-locking off命令;

断点的分类:
1.普通断点,break n或者until n;
2.硬件断点(数据断点),watch 变量、地址或连续内存的部分断点,存在软断;
3.条件断点,break [lineno] if [condition]

多进程调试:
调试多进程若是无关联关系的多进程就是开多个gdb调咯,若是fork出来的多进程,那么可以有以下两种方式调试;
1.等fork出来后新开个gdb attch到子进程PID就醒了;
2.使用 set follow-fork child(默认parent) 跟随调试子进程;

GDB-TUI界面显示代码:
开启gdb-tui两种方法:
1.gdbtui -q 程序名;
2.调试过程中ctrl + X + A ;

CGDB也是类似的图形化界面显示调试工具:
安装下可以使用 :cgdb 程序名称;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值