Java虚拟机(JamVM)源码剖析-(2)源码调试
2. 调试
2 .1 使用gdb调试
安装gdb
sudo yum install gdb
运行gdb
gdb -tui /usr/local/jamvm/bin/jamvm
具体的调试步骤,查看gdb命令进行调试。
这种调试方式,我个人不是很习惯,所以从网上找到了下面这种方式,更符合平常开发的习惯。
2.2 使用vscode进行 gdb remote 调试
2.2.1 安装vscode插件
打开vscode
安装插件 Remote -ssh
、 Remote Development
2.2.2 使用remote ssh插件登录虚拟机
打开设置,搜索 Remote -ssh
勾选Remote.SSH:Show Login Terminal
随后,ctrl + shift + p
选择Remote-SSH
添加一个新的SSH Host。
这里推荐使用秘钥方式登录
如果你和我一样,用的是vagrant虚拟环境,通过上面的方式可以知道,vagrant是使用
vagrant ssh
命令登录虚拟机的,所以,也可以在~/.ssh/authorized_keys中追加一个秘钥的方式,来实现免密登录。具体怎么实现,搜索SSH免密登录即可,不再展开说明了
在上一步,选择一个新的SSH Host,输入 用户名@主机 -p端口` 之后,会新建一个窗口,左下角也同时会展现出当前登录的远程主机。
当你连接过至少一次之后,下次可以通过下面的方式,直接登录
2.2.3 使用remote development插件进行调试
登录到远程主机之后,需要打开远程主机上的源码目录。
我的代码再/vagrant/jamvm-code/目录下 选择即可
这时,vscode会打开远程主机上的源码,接下来,开始进行调试前的vscode准备
2.2.4 远程主机安装c++插件,用来支持debug
选择插件栏目,搜索c/c++插件,进行安装。
这里我已经安装了。
我在安装的时候,碰到了安装失败的情况。
如果你也碰到了,可以点击进行下载,然后点击插件页面的右上角,选择
install form VSIX
,随后再目录当中选择下载好的插件进行安装即可注意!!!这些操作始终都在远程主机上进行的,你安装的插件也在远程主机上!!!
所以你选择的插件,需要传到远程主机上才可以,这里我用的是虚拟机,有目录进行挂载,所以很方便。如果是远程主机的同学,可以线传输再选择插件安装
2.2.5 配置gdb-server
为了接下来进行远程调试,需要再虚拟机里面运行gdbserver
来到虚拟机,运行gdbserver
gdbserver :1234 /usr/local/jamvm/bin/jamvm HelloWorld
HelloWorld
是一个class 这里没有使用全路径,是因为我就在这个目录里面,需要注意一下。
执行完这一步,gdbserver就启动好了,等待vscode接下来的链接了。
2.2.6 配置launch.json
选择run -> start debuging
会给你的工作目录下生成一个.vscode/launch.json文件,进行配置。
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "gdb remote",
"type": "cppdbg",
"request": "launch",
"program": "/usr/local/jamvm/bin/jamvm",
"args": ["HelloWorld"],
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "gdb",
"miDebuggerArgs": "gdb",
"miDebuggerServerAddress": "127.0.0.1:1234",
"linux" : {
"MIMode": "gdb",
"miDebuggerPath": "/usr/bin/gdb",
"miDebuggerServerAddress": "127.0.0.1:1234",
},
"logging": {
"moduleLoad": false,
"engineLogging": false,
"trace": false
},
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
注意
program
就是要运行的程序 这里我要运行的就是jamvm 输入全路径
args
就是运行程序要的参数,这个参数就是一个.class文件,和上面在测试使用的是同一个文件
miDebuggerServerAddress
选择你的主机地址和gdbservier端口,上面我选择的是1234,所以这里也是1234其他的参数,尽量和我保持一致,先全部重心保持在能进行调试,再发散拓展其他的知识点。
2.2.7 debug!!!
终于可以debug了
先打个断点。jamvm的main方法在src/jam.c文件中,这里,我在代码的第一个行打了个断点
选择run -> start debuging
可以看到,调试启动了~~~~~撒花
2.2.8 环境搭建、调试搭建的参考资料
真的很不容易啊,找了好久的资料才搞定调试。
从编译、到c代码的调试,再到现在ide的可视化调试,找了好多资料,到处碰壁....
不过还好,思路正确,碰到问题,解决问题即可,目标还是能达到的,就是坎坷了点,哈哈哈哈
特别感谢下面的这些大佬给的资料
这个博客给我的帮助最大,让我建立起了整个编译、调试的思路 JamVM 开发调试环境搭建