这几天需要在vpp下面写一个新函数接口,频繁使用gdb,因此做一下记录,主要是指令和操作
gdb指令参考:
链接: gdb使用
链接: gdb 常用命令
文章目录
一、vpp进入调试
ubuntu系统:
在项目目录下:
$ make build
$ make debug
到(debug)命令行,输入r表示调试:
(debug) r
这里就是等待用户输入,这时候新建一个窗口,输入nat等指令进行交互。
二、打断点
以下断点关键字break
均可以简写为b
指定文件名的加断点
由于项目中很多文件,建议使用指定文件名的加断点方法:
break [filename]:[line]
比如:
break /git/vpp/src/plugins/nat/det44/det44_in2out.c:1510
这里建议文件名使用绝对路径。
对函数名加断点
break [function]
比如:
break main
删除所有断点
delete
查看所有断点信息
info breakpoints
删除指定断点
delete [breakpoint number]
[breakpoint number] 可以通过 info breakpoints 指令查看
也可以delete
一键全部删除
三、ubuntu新建窗口
由于调试需要和用户交互,因此新开一个窗口,使用screen指令
新建窗口
screen
或
Ctrl-a c //先同时按Ctrl和a,然后按c
或
screen -S myWindow // 新建一个指定名字为myWindow 的窗口
切换窗口
Ctrl-a n
:切换到下一个窗口。
Ctrl-a p
:切换到上一个窗口。
关闭窗口
Ctrl-a k
:关闭当前窗口。
然后根据提示按下 y 。
分离窗口
Ctrl-a d
:分离当前会话。
分离会话时,会话并不会终止。分离会话只是将终端与会话断开连接,但会话仍然在后台运行。可以关闭终端窗口,稍后重新连接并恢复会话。
如果想要终止一个分离的screen会话,可以使用
screen -S [session #] -X quit
这将发送一个quit命令到指定的会话,从而终止该会话。
比如:
screen -S 69551.pts-0.jxtvpp -X quit
查看存在的screen会话
screen -ls
21605.pts-0.jxtvpp 就是这个新窗口的ID
根据ID进入窗口
screen -r 21605.pts-0.jxtvpp
四、开始调试
在新开的窗口中进入vpp指令界面,输入
sudo vppctl
然后输入指令,比如查看nat路由,当涉及到打断点的函数时,切换到调试窗口,会发现程序重新回到gdb模式:
gdb调试指令
设置了断点之后,可以运行程序,当程序运行到断点处时,它将暂停执行,并将控制权返回给GDB。此时可以使用GDB的调试命令来检查程序状态、单步执行代码或继续运行程序。
r :运行程序。您可以在命令后面添加程序参数。
c:继续运行程序,直到遇到下一个断点或程序结束。
n:执行下一行代码(单步执行),但不进入函数调用。
s:执行下一行代码(单步执行),并进入函数调用。
p [expression]:打印表达式的值。
bt:打印当前线程的调用栈。
q:退出GDB。
调试怎么看
1517 lo = true;
表示执行到了这一行,但这一行还未执行,这可以通过打印 lo 的值看出