在业务代码开发的过程中通常使用GDB进行调试,调试FT也会使用GDB进行问题定位。下面梳理下常用的GDB命令,方便后续的查阅。当然在GDB中也可以直接help all查看所有的命令。
1,gdb programe_A 进入gdb调试模式,programe_A是某可执行程序。
2,b(break缩写) function_A 设置函数function_A为断点,当程序运行到该函数的时候停止,第一个设置的函数往往标记为break 1;b function_B 设置函数function_B为断点,第二个设置的函数往往标记为break 2。
3,d(delete缩写) 1,表示删除断点1,则可执行程序再次运行的时候,就不会在该断点所指函数处暂停。查看断点的信息,可以使用8中的info b或者 i b来显示所有的断点。
4,r(run缩写) 表示执行该可执行程序,如果该可执行程序有入参之类的,则是r args 形式。
5, n(next缩写) 表示当程序运行到断点处的时候,程序一行行的执行下去,如果遇到函数,并不会跳入函数内部执行。
6,s(step缩写)表示跳入当前执行语句的内部进行执行,如果当前语句是一个函数吗,或者一个宏,则会进入相应的函数体等。如果想切换成单步执行,输入n ,回车即可,则会像第5步那样单步执行。
7,p(print缩写) var_A表示打印变量var_A,当程序执行到某处的时候,使用该命令可以打印当前变量值,这也是在调试程序或者FT时候经常需要查看的。
8,i(info缩写)表示查看当前函数体内相关信息。只输入i的时候会有提示查看哪些信息。例如i args会输出该函数的入参信息,地址等,i source表示输出还函数所在文件相关信息,i stack输出当前函数的调用栈,跟bt功能一样,总之该命令功能强大。
9,set var_A=5 表示设置变量var_A值为5。例如有的时候想验证该变量在某些值情况下,会走哪些分支,还是很有用的。
10,bt(backtrace缩写)表示查看函数调用栈关系。
11,f(finish缩写)表示结束当前的运行,停留在运行到的位置,等待下一个命令动作。
12,c(continue缩写)表示程序继续运行,至下一个断点处停止。
13,q(quit缩写)表示退出gdb调试,一般在Linux环境中 Ctrl+Z表示前置终止当前程序也是可以的。
14,enable 1表示启用1号断点,disable 2表示禁用2号断点。
15,watch var_a表示设置var_a为观察点,当var_a发生变化,例如被赋值的时候。打印改变量的详细信息,包括新老值。info watch表示显示所有观察点信息。
16,display var_a表示追踪变量var_a的信息,即每执行一条语句,就打印追踪变量的值。
17,x(examine缩写),表示查看内存。例如x/4db var_a 表示从var_a变量开始位置读取4个单位,以单字节(b)为单位,十进制显示(d)。当然关于x命令的详解可以通过help x查看。
当然,gdb的用法非常的多,以上只是一些常用的命令,足够日常使用。除了调试之外,在业务代码中加入统计,加入打印是常用的调试手段,因为外场不能够gdb进行调试。在ST的时候统计和打印较为重要。像openssl的错误统计输出信息的erro模块的设计其实也是值得借鉴的,在优快云 openssl源码之error模块分析这篇文章中我做了粗浅的分析。
本文为优快云村中少年原创文章,转载记得加上小尾巴偶,博主链接这里。