Gdb命令整理

Github-blog
CSDN

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              //查看当前锁定线程的模式

猜你喜欢

转载自blog.csdn.net/xftony/article/details/80536492