从小对着vs点着stepin,stepover的,乍一没有图形界面的编译调试一体化工具,还真的是抓狂。
没办法,人都是逼出来的。在windows下鼓捣了一天eclipse+cygwin无果后,晚上只好看了下gdb。
成果记录下:
0、gdb有补齐;欲调试程序用g++编译带-g
1、常用命令:
file <可执行二进制文件名> —— 载入欲调试程序
list(l) —— 查看源码
run(可给参数,可重定向,可支持通配符) —— 运行程序
break <源文件行号><函数名> —— 设置断点
condition <断点编号> —— 在断点设置条件(即条件满足时才中断)
info break —— 查看断点信息
next (n)|step—— 单步执行
watch <变量名><表达式> —— 设置观察点
continue (c)—— 继续运行
print <变量名> (p)—— 观察变量值
bt —— 查看调用堆栈
frame <fid>—— 打印指定帧
info locals —— 打印当前帧的局部变量
info还有很多,frame,args,variables等...
set 变量=值 —— 在程序运行时改变变量取值
启动gdb时,可gdb <programname> core,将core文件加载
可 gdb <programname> <pid> attach一个正在运行的程序进行调试
call <funcname> —— 调用一函数执行
whatis 变量名 —— 查看变量类型
参考文章:http://kb.cnblogs.com/a/1532117/
2、多进程调试方法:
follow-fork-mode [parent|child] :parent: fork之后继续调试父进程,子进程不受影响。child: fork之后调试子进程,父进程不受影响。
attach <pid>:通过ps和pstree可以查看到所要调试的子进程pid。在子进程前加入一段调试代码,在调试代码中加断点,构造条件从断点处继续执行。
3、多线程调试方法:
info threads —— 查看当前被调试进程的线程
thread <ID> —— 切换调试线程为指定线程
set scheduler-locking off|on|step—— 针对当前调试线程和其他线程执行的控制
- off 不锁定任何线程,也就是所有线程都执行,这是默认值。
- on 只有当前被调试程序会执行。
- step 在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行。