GDB 调试总结

GDB 调试总结

启动:

$gdb || $gdb 然后(gdb)file

运行:

(gdb)run <该程序本身的命令行参数>

查看代码:

(gdb)list 简写为 (gdb)l

技巧(gdb)list 1,20 //查看1到20行的代码

使用断点:

建立断点

(gdb)break //可以简写为(gdb)b

(gdb)b || : //这种是为还没有打开的源代码设置断点

(gdb)b || : ||

//在一个物理地址设置断点

查看断点

(gdb)info b

删除断点

(gdb)delete

(gdb)clear || :

条件断点

(gdb)break <operator(通常是函数名)> if = //用于在满足某个条件时中断执行,在该operator处暂停

运行过程:

单步跟踪:

(gdb)step //缩写s

往下执行:

(gdb)next //缩写n

检查数据:

(gdb)display //例如(gdb)display stack->index

(gdb)print //缩写p

改变数据:

(gdb)set = //例如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

锁定调度器来避开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临时断点

断点禁用启用

猜你喜欢

转载自blog.csdn.net/weixin_41622014/article/details/86290423