[讨论] 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 谢谢!!! |