[讨论] HotSpot gdb调试, No source file named ...

shigangxing 2014-03-17
想用gdb调试hotspot, 但是只有java.c可以break,换了其它cpp文件就不行,不知道什么原因?
(gdb) break collectorPolicy.cpp:66
No source file named collectorPolicy.cpp

下面是执行gdb的代码:
hotspotDir=/install/java/openjdk/hotspot;
export LD_LIBRARY_PATH=$hotspotDir/make/linux/linux_amd64_compiler2/jvmg
gdb --args $hotspotDir/make/linux/linux_amd64_compiler2/jvmg/gamma -cp /root -XX:MaxPermSize=300m HelloWorld


RednaxelaFX 2014-03-17
看起来楼主是做了个jvmg build。那个包含了最完整的debug信息,是应该可以用gdb在源文件上设断点的。我平时工作都用jvmg来做开发和调试,没遇到过这样的问题。

但我也没试过这样用LD_LIBRARY_PATH跟gamma launcher组合用。gamma launcher一直以来问题多多所以我从来不用它。用完整的debug版JDK里正常的java launcher不知道会不会解决楼主的问题呢?只是好奇,多半没用…

另外楼主能不能试试gdb启动的时候只指定可执行文件,像这样:
gdb $hotspotDir/make/linux/linux_amd64_compiler2/jvmg/gamma
然后在gdb提示符下用dir命令来指定源码路径,和用break来设置文件断点,然后再用run -cp /root -XX:MaxPermSize=300m HelloWorld来启动您的被调试程序?
shigangxing 2014-03-17
多谢,我试试看
ZHH2009 2014-03-22
我也碰到类似问题,
我的环境是Ubuntu 12.04 64位
OpenJDK版本是 7u40 Build b43
GCC 8.2
GDB 7.7
HotSpot的构建方式是:
make jvmg ALT_BOOTDIR=$JAVA_HOME ALT_JDK_IMPORT_PATH=$JAVA_HOME ARCH_DATA_MODEL=64 LANG=C SKIP_FASTDEBUG_BUILD=false

用GDB调式时,java.c、java_md.c这些都能打断点,
其他CPP试了几个都提示No source file named
比如break thread.cpp: 3342这样就出现这个提示,
用绝对路径也不行,用dir /home/hotspot/src/share/vm/runtime这样也不行,
考虑到thread.hpp在源代码中是这样include的"#include runtime/thread.hpp"
所以在gdb中先dir /home/hotspot/src/share/vm
然后break  runtime/thread.cpp: 3342还是报同样的错,
忽视这个错,按r运行一次,再重新break也还是不行。
ZHH2009 2014-03-22
构建好后,在build/.../jvmg下面有个hotspot脚本的,可以运行这个脚本debug,但是对于cpp类的文件同样不能break
RednaxelaFX 2014-03-22
话说你们在build完HotSpot之后是怎么用的?

楼主直接在jvmg目录里用gamma launcher的话,那请直接在那个目录里把libjvm.diz文件unzip一下。
楼上不知道是不是用gamma launcher的?

我是build完把build出来的东西export到一个对应版本的完整JDK里然后用正常的java launcher来启动的。
这样的话就要去export之后libjvm.so所在的地方把libjvm.diz文件unzip一下。

libjvm.so在build的最后步骤被strip过,里面的符号信息全部都提取到外部的文件然后zip压缩起来成libjvm.diz文件了。这个必须解压才有符号信息啊。我天天都这么做,还专门写了脚本来完成整个make和export动作所以都忘记有这么一回事了…
ZHH2009 2014-03-22
用gdb gamma或者build/.../jvmg下面的hotspot脚本(其实也是用gamma)都是不能break cpp文件的,libjvm.diz要unzip这个倒是没注意。
douyu 2014-03-22
我是ZHH2009的马甲,

按RednaxelaFX说的,把libjvm.diz解压后,把里面的文件放到跟libjvm.so同级的目录,然后break thread.cpp:3342,虽然还是会出来No source file named thread.cpp,但后面还有句Make breakpoint pending on future shared library load? (y or [n]),
选择y,然后按c,就能在cpp文件里打断点了。

不解压libjvm.diz就不行,所以记得要解压libjvm.diz

多谢RednaxelaFX的提示,这问题折腾我一天了。
RednaxelaFX 2014-03-22
douyu 写道
我是ZHH2009的马甲,

按RednaxelaFX说的,把libjvm.diz解压后,把里面的文件放到跟libjvm.so同级的目录,然后break thread.cpp:3342,虽然还是会出来No source file named thread.cpp,但后面还有句Make breakpoint pending on future shared library load? (y or [n]),
选择y,然后按c,就能在cpp文件里打断点了。

不解压libjvm.diz就不行,所以记得要解压libjvm.diz

多谢RednaxelaFX的提示,这问题折腾我一天了。

好!我就说咋会设不了断点的
baishuo491 2014-05-11
我用@zhh2009,提供的命令,make jvmg ALT_BOOTDIR=$JAVA_HOME ALT_JDK_IMPORT_PATH=$JAVA_HOME ARCH_DATA_MODEL=64 LANG=C SKIP_FASTDEBUG_BUILD=false,尝试编译hotspot,编译结束后,没有收到error信息,但是也没找到jvmg目录,找到一个debug目录,里面也没有gamma命令,但是这个目录下包含那个libjvm.diz文件。不知道我做的地方是有哪里不对吗?我的源码是从zhh2009的github上下载的。环境是ubuntu12.04,gcc---gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3,gdb---GNU gdb (Ubuntu/Linaro 7.4-2012.02-0ubuntu2) 7.4-2012.02

编译过程中控制台的警告:
Warning: The jvmg target has been replaced with debug
Warning: Please update your usage
**NOTICE** Dtrace support disabled: /usr/include/sys/sdt.h not found

谢谢!!!
Global site tag (gtag.js) - Google Analytics