您的位置:首页 > 其它

GDB 调试总结

2012-05-03 12:57 543 查看


资料出处:http://www.cppblog.com/TianShiDeBaiGu/archive/2012/02/16/gdb.html


GDB 调试总结

启动:
$gdb <file> || $gdb 然后(gdb)file <file>
运行:
(gdb)run <该程序本身的命令行参数>

查看代码:
(gdb)list 简写为 (gdb)l
技巧(gdb)list 1,20 //查看1到20行的代码

使用断点:
建立断点
(gdb)break //可以简写为(gdb)b
(gdb)b <function> || <file>:<function>
//这种是为还没有打开的源代码设置断点
(gdb)b <line> || <file>:<line> || <address>
//在一个物理地址设置断点
查看断点
(gdb)info b

删除断点
(gdb)delete <breakpoint number>
(gdb)clear <line> || <file>:<line>
条件断点
(gdb)break <operator(通常是函数名)> if <op> = <value> //用于在满足某个条件时中断执行,在该operator处暂停

运行过程:
单步跟踪:
(gdb)step //缩写s
往下执行:
(gdb)next //缩写n
检查数据:
(gdb)display <varible> //例如(gdb)display stack->index
(gdb)print <varible> //缩写p <varible>
改变数据:
(gdb)set <varible>=<value> //例如set stack->index=100
检查堆栈:
(gdb)backtrace //缩写bt, 将会打印当前调用的堆栈,从深到浅
停止程序:
(gdb)quit //缩写q

多进程调试:
跟踪子进程:
(gdb)set follow-fork-mode child
跟踪父进程:
(gdb)set follow-fork-mode parent
设置gdb在fork时询问跟踪哪一个进程:
(gdb)set follow-fork-mode ask

多线程调试:
如果某一行代码被多个线程使用,可以这样设置断点:
(gdb)b pos.c:17 thread 5 //在地pos.c的17行设置断点,但只对第5个线程生效。
(gdb)info threads //查看当前应用程序中所有的线程
(gdb)b pos.c:17 thread 5 if ret > 0 //在pos.c的17行设置断点,当内部栈变量ret > 0 时中断
去指定线程:
(gdb)thread <thread number>
锁定调度器来避开gdb根据优先权来改变当前线程:
(gdb)set scheduler-locking on/off
确定当前模式
(gdb)show scheduler -locking
想所有线程应用一个命令:
(gdb)thread apply all <command(比如backtrace)>
(gdb)thread apply 1 4 9 backtrace

调试已有的进程:
$gdb
挂接指定进程 :(gdb)attach <进程号>
脱离指定进程 :(gdb)dettach

调试内核转储文件:
$test
产生一个core文件,需要设置系统环境,见我的博客文章 www.cppblog.com/TianShiDeBaiGu/articles/125785.html
$gdb test core.12345

??????????????????????????,没有尝试过的

(gdb)wacth 监控一个变量改变

(gdb)tbreak临时断点

断点禁用启用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: