终端中gdb断点进入源码调试hotspot
1 编译class
1 | vim ~/Test.java |
2 进入gdb测试
1 | # 第一步,启动gdb |
整个操作如下图所示:
在IDE中调试,这里选择Clion
1 导入项目
打开clion,选择 File->ImportProject
,选择到 ~/ClionProjects/openjdk-8/hotspot
作为jvm源码的根目录,这里导入的过程无脑点击next
即可
对于可能遇到的头文件不包含问题,解决如下:
clion导入源码之后遇到头文件找不到的问题,而实际上这些头文件在源码里面是存在的,只不过在某些源文件里面是以相对路径的方式来搜索,可以在CMakeLists.txt
里面添加一些根路径
1 | include_directories(./src/share/vm) |
另外,如果某些头文件依然找不到,可以手工导入,然后把导入的头文件加到hotspot/src/share/vm/precompiled/precompiled.hpp
里,因为大多数源文件都会包含这个源文件
1 | # include <cstdlib> |
2 配置debug
右上角,点击Edit Configuration
进入如下界面,添加Application:jdk-8,Execuable
中选择~/CLionProjects/openjdk-9/build/linux-x86_64-normal-serverANDclient-slowdebug/jdk/bin
Before lauch: Activate tool window 下的预build项一定要去掉,我的已经去掉了
3 设置断点,开始debug
断点选在jni.cpp
的创建vm处,然后开始debug
这里如果报错,如下图所示:
可以在点击LLDB
,输入process handle SIGSEGV --stop=false
即可,这里告诉编译器忽略错误
一般Clion默认使用GDB
进行debug,可以根据如下所示进行切换
同理,若为GDB
的话,点击输入handle SIGSEGV pass noprint nostop
即可
动图如下:
参考资料