gdb简介
GDB是GNU开源组织发布的一个强大的UNIX及UNIX-like下的程序调试工具。
一般来说,GDB主要帮助你完成下面四个方面的功能(摘自百度百科):
1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
3、当程序被停住时,可以检查此时你的程序中所发生的事。
4、你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG。
gdb命令简介
(gdb) start //开始调试
(gdb) n //一条一条执行
(gdb) step/s //执行下一条,如果函数进入函数
(gdb) backtrace/bt //查看函数调用栈帧
(gdb) info/i locals //查看当前栈帧局部变量
(gdb) frame/f //选择栈帧,再查看局部变量
(gdb) print/p //打印变量的值
(gdb) finish //运行到当前函数返回
(gdb) set var <var>=0 //修改变量值
(gdb) list/l 行号或函数名 //列出源码
(gdb) display/undisplay sum //每次停下显示变量的值/取消跟踪
(gdb) break/b 行号或函数名 //设置断点
(gdb) continue/c //连续运行
(gdb) info/i breakpoints //查看已经设置的断点
(gdb) delete breakpoints 2 //删除某个断点
(gdb) disable/enable breakpoints 3 //禁用/启用某个断点
(gdb) break 9 if sum != 0 //满足条件才激活断点
(gdb) run/r //重新从程序开头连续执行
(gdb) watch <expr> //设置观察点,表达式<expr>值改变,停止程序
(gdb) info/i watchpoints //查看设置的观察点
(gdb) x/20d $esp //查看内存中开始的20个数,以十进制显示,d替换成x即为16进制显示
(gdb) disassemble //反汇编当前函数或指定函数
(gdb) si // 一条指令一条指令调试 而 s 是一行一行代码
(gdb) info registers // 显示所有寄存器的当前值
(gdb) info line //查看源代码在内存中的地址。info line后面可以跟, 行号,函数名,文件名:行号,文件名:函数名,这个命令会打印出所指定的源码在运行时的内存地址
(gdb) jump <linespec> //指定下一条语句的运行点,<linespce>可以是文件的行号,file:line格式,或者+num偏移量格式。表式着下一条运行语句从哪里开始。
(gdb) jump <address> //<address>是代码行的内存地址
(gdb) return <expression> //取消当前函数的执行,并立即返回
gdb多线程调试
(gdb)info threads //显示当前可调试的所有线程, *为当前正在调试线程
(gdb)thread ID // 切换到指定ID的线程
(gdb)thread apply ID1 ID2 command //让一个或者多个线程执行gdb命令command, ID 为all表示所有线程
(gdb)set scheduler-locking [off|on|step] //off, 不锁定任何线程,也就是所有线程都执行,这是默认值;
//on, 只有当前被调试程序会执行;
//step,调度程序在步进命令(step,next,stepi,nexti)中锁定,其他线程可能执行其他命令
(gdb)show scheduler-locking //查看当前锁定线程的模式