这几天需要在vpp下面写一个新函数接口,频繁使用gdb,因此做一下记录,主要是指令和操作
gdb指令参考:
链接: gdb使用
链接: gdb 常用命令
文章目录
一、vpp进入调试
ubuntu系统:
在项目目录下:
$ make build
$ make debug
到(debug)命令行,输入r表示调试:
(debug) r
这里就是等待用户输入,这时候新建一个窗口,输入nat等指令进行交互。
其他进入调试的方法
为了生成一个debug版本(可调式)的可执行程序,可以在makefile中编译的时候带上参数-g
参考:【Linux】GDB保姆级调试指南(什么是GDB?GDB如何使用?)
二、打断点
以下断点关键字break
均可以简写为b
1、指定文件名的加断点
由于项目中很多文件,建议使用指定文件名的加断点方法:
break [filename]:[line]
比如:
break /git/vpp/src/plugins/nat/det44/det44_in2out.c:1510
这里建议文件名使用绝对路径。
2、对函数名加断点
break [function]
比如:
break main
3、删除所有断点
delete
4、查看所有断点信息
info breakpoints
5、删除指定断点
delete [breakpoint number]
[breakpoint number] 可以通过 info breakpoints 指令查看
也可以delete
一键全部删除
6、使断点无效
使所有断点无效:
disable b
使某个断点无效:
disable b [breakpoint number]
7、使断点生效
使所有断点生效:
enable b
使某个断点无效:
enable b [breakpoint number]
三、ubuntu新建窗口
由于调试需要和用户交互,因此新开一个窗口,使用screen指令
1、新建窗口
screen
或
Ctrl-a c //先同时按Ctrl和a,然后按c
或
screen -S myWindow // 新建一个指定名字为myWindow 的窗口
2、切换窗口
Ctrl-a n
:切换到下一个窗口。
Ctrl-a p
:切换到上一个窗口。
3、关闭窗口
Ctrl-a k
:关闭当前窗口。
然后根据提示按下 y 。
4、分离窗口
Ctrl-a d
:分离当前会话。
分离会话时,会话并不会终止。分离会话只是将终端与会话断开连接,但会话仍然在后台运行。可以关闭终端窗口,稍后重新连接并恢复会话。
如果想要终止一个分离的screen会话,可以使用
screen -S [session #] -X quit
这将发送一个quit命令到指定的会话,从而终止该会话。
比如:
screen -S 69551.pts-0.jxtvpp -X quit
5、查看存在的screen会话
screen -ls
21605.pts-0.jxtvpp 就是这个新窗口的ID
6、根据ID进入窗口
screen -r 21605.pts-0.jxtvpp
四、开始调试
在新开的窗口中进入vpp指令界面,输入
sudo vppctl
然后输入指令,比如查看nat路由,当涉及到打断点的函数时,切换到调试窗口,会发现程序重新回到gdb模式:
gdb调试指令
设置了断点之后,可以运行程序,当程序运行到断点处时,它将暂停执行,并将控制权返回给GDB(如上图最后一行,会出现GDB的命令提示符“(gdb)”)。
此时可以使用GDB的调试命令来检查程序状态、单步执行代码或继续运行程序。
1、运行程序
下面的指令都是 GDB的调试命令 (gdb) 后面输入的
执行程序(RUN):
r
当没有打断点时,会一直执行直到程序结束。
2、显示代码
指定行号查看(list)代码,可以在调试断点处查看断点附近代码(默认10行):
l
也可以指定从某行(begin_line)到某行(end_line):
l begin_line:end_line
也可以指定某个文件的某个函数:
l file_name:func_name
3、继续运行
继续运行程序(continue),直到遇到下一个断点或程序结束。
c
4、逐过程执行
执行下一行代码(单步执行),但不进入函数调用。
n
5、逐语句
执行下一行代码(单步执行),并进入函数调用。
s
6、打印变量值
打印表达式或变量的值。
p variable
7、跟踪查看变量值
每次程序暂停(如到达断点,每次单步执行),都会自动打印跟踪的变量或表达式的值,就不用每次手动执行打印p
命令
display variable
8、查看所有跟踪的变量:
info dispaly
可以看到所有跟踪变量的编号、状态(是否每次暂停都被打印)、以及变量名
9、删除要跟踪的变量
undisplay variable
undisplay variable_num
参数为变量名或变量编号
10、查看调用栈
打印当前线程的调用栈,可以看到底层函数调用的过程
bt
从上往下,可以看到当前位置到程序的入口,可以判断程序是在哪里停住了。
11、退出调试
退出gdb调试(quit)
q
调试怎么看
1517 lo = true;
表示执行到了这一行,但这一行还未执行,这可以通过打印 lo 的值看出