Java虚拟机(JamVM)源码剖析-(2)源码调试

2. 调试

2 .1 使用gdb调试

安装gdb

sudo yum install gdb

运行gdb

gdb -tui /usr/local/jamvm/bin/jamvm

具体的调试步骤,查看gdb命令进行调试。

GDB调试命令

这种调试方式,我个人不是很习惯,所以从网上找到了下面这种方式,更符合平常开发的习惯。


2.2 使用vscode进行 gdb remote 调试


2.2.1 安装vscode插件

打开vscode

安装插件 Remote -sshRemote Development


2.2.2 使用remote ssh插件登录虚拟机

打开设置,搜索 Remote -ssh 勾选Remote.SSH:Show Login Terminal

image

随后,ctrl + shift + p 选择Remote-SSH

image

添加一个新的SSH Host。

这里推荐使用秘钥方式登录

如果你和我一样,用的是vagrant虚拟环境,通过上面的方式可以知道,vagrant是使用vagrant ssh命令登录虚拟机的,所以,也可以在~/.ssh/authorized_keys中追加一个秘钥的方式,来实现免密登录。

具体怎么实现,搜索SSH免密登录即可,不再展开说明了

在上一步,选择一个新的SSH Host,输入 用户名@主机 -p端口` 之后,会新建一个窗口,左下角也同时会展现出当前登录的远程主机。

当你连接过至少一次之后,下次可以通过下面的方式,直接登录

image


2.2.3 使用remote development插件进行调试

登录到远程主机之后,需要打开远程主机上的源码目录。

image

我的代码再/vagrant/jamvm-code/目录下 选择即可

这时,vscode会打开远程主机上的源码,接下来,开始进行调试前的vscode准备


2.2.4 远程主机安装c++插件,用来支持debug

选择插件栏目,搜索c/c++插件,进行安装。

image

这里我已经安装了。

我在安装的时候,碰到了安装失败的情况。

如果你也碰到了,可以点击进行下载,然后点击插件页面的右上角,选择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文件中,这里,我在代码的第一个行打了个断点

image

选择run -> start debuging

image

可以看到,调试启动了~~~~~撒花


2.2.8 环境搭建、调试搭建的参考资料

真的很不容易啊,找了好久的资料才搞定调试。

从编译、到c代码的调试,再到现在ide的可视化调试,找了好多资料,到处碰壁....

不过还好,思路正确,碰到问题,解决问题即可,目标还是能达到的,就是坎坷了点,哈哈哈哈

特别感谢下面的这些大佬给的资料

这个博客给我的帮助最大,让我建立起了整个编译、调试的思路 JamVM 开发调试环境搭建

javvm源码中的INSTALL指南

使用vscode进行gdb远程调试

JAMVM + openjdk8 编译和调试

posted @ 2021-09-14 17:38  卡卡一点都不卡  阅读(184)  评论(0编辑  收藏  举报