ubuntu下编译openjdk成为可调试版

zjt5916 2011-05-20
具体编译ubuntu需要安装哪些依赖软件 RednaxelaFX大大的一边博客中已经写过了
我刚开始在编译的时候 生成的openjdk不是debug版的 所以 编译完成后 发现用gdb没法调试  后来 我在顶层目录里边的makefile发现 一边有这样一段注释 taget_help :
  all
  help
  check
  sanity
  debug_build
  clean
.....
就是在make的时候 可以加的参数 其中debug_build它给的解释就是 生成debug版的openjdk  所以 我就又在重新编译它(都怪我以前没有写过makefile , 只能从头学起)
目前 我的openjdk7还在编译的过程中 等它在编译出来后 我看看它可不可以用gdb调试

还有一件事就是 我编译openjdk是想做这样一件事  弄清楚它从.class 到jvm  然后 jvm到本地函数调用 这个过程是什么样  然后 等我弄清楚了 我就想 是不是我自己可以 写一些本地的c库 然后在写一些核心的java类 扩展jdk的新功能(比如说加个蓝牙呀 wifi功能之类的) 这只是小的一些想法 在实践的过程中肯定会遇到各种问题
希望各位大大 能给小的提些建议 这个调试的过程中应该注意些什么
RednaxelaFX 2011-05-21
如果目的只是“能够写JNI程序”的话那完全不需要先费力看JVM是怎么实现的,只要看JNI规范在看几个例子就好了。蓝牙、Wi-Fi这些外围设备的功能直接在库一级做就好了,完全不需要侵入到VM内。

如果你用默认配置来build出OpenJDK,在生成的build结果目录里应该有j2sdk-image目录,这个是product build的JDK,另外还应该有j2sdk-debug-image目录,里面就是fastdebug build。用后者调试起来会容易那么一点点。

要用gdb调试有动态链接库的程序的话,最好是先用gdb启动这个程序完整的跑一次。这样gdb就会记住被加载过的动态链接库的符号信息,下次在用gdb启动就能在动态链接库里的代码很方便的下断点了。

但实际上要调试HotSpot最麻烦的就是里面动态生成的代码。例如说默认用的解释器(template interpreter)就是在VM启动过程中生成出来的。再例如说从C调用Java方法也会经过动态生成的stub。更不用说被动态编译的Java方法了。这些代码无论在哪个build里调试起来都不容易,特别是因为它们缺乏gdb能识别的符号信息。

有几种办法能应对这问题。一个是改善HotSpot的实现,让它生成gdb能识别的符号信息。这点可以向V8学习。
但如果不修改HotSpot的代码,就在现在的实现上要调试动态生成的代码也可以。只要你对代码足够的熟悉…这个时候你就得靠stepi之类的方式做汇编级调试,但也不会真的很难,就是麻烦而已。
zjt5916 2011-05-21
RednaxelaFX 写道
如果目的只是“能够写JNI程序”的话那完全不需要先费力看JVM是怎么实现的,只要看JNI规范在看几个例子就好了。蓝牙、Wi-Fi这些外围设备的功能直接在库一级做就好了,完全不需要侵入到VM内。

如果你用默认配置来build出OpenJDK,在生成的build结果目录里应该有j2sdk-image目录,这个是product build的JDK,另外还应该有j2sdk-debug-image目录,里面就是fastdebug build。用后者调试起来会容易那么一点点。

要用gdb调试有动态链接库的程序的话,最好是先用gdb启动这个程序完整的跑一次。这样gdb就会记住被加载过的动态链接库的符号信息,下次在用gdb启动就能在动态链接库里的代码很方便的下断点了。

但实际上要调试HotSpot最麻烦的就是里面动态生成的代码。例如说默认用的解释器(template interpreter)就是在VM启动过程中生成出来的。再例如说从C调用Java方法也会经过动态生成的stub。更不用说被动态编译的Java方法了。这些代码无论在哪个build里调试起来都不容易,特别是因为它们缺乏gdb能识别的符号信息。

有几种办法能应对这问题。一个是改善HotSpot的实现,让它生成gdb能识别的符号信息。这点可以向V8学习。
但如果不修改HotSpot的代码,就在现在的实现上要调试动态生成的代码也可以。只要你对代码足够的熟悉…这个时候你就得靠stepi之类的方式做汇编级调试,但也不会真的很难,就是麻烦而已。




奥 我明白唠  可以用jni 然后自己封装出来几个神马WifiHelper类就可以了 
这样就可以做到扩展的目的
那我们调试hotspot的目的 在什么地方呢 调试它有什么作用呢 ?
  
RednaxelaFX 2011-05-21
zjt5916 写道
奥 我明白唠  可以用jni 然后自己封装出来几个神马WifiHelper类就可以了 
这样就可以做到扩展的目的
那我们调试hotspot的目的 在什么地方呢 调试它有什么作用呢 ?
  

这就要看你的目的了…
要了解内部实现方式,调试是一种有效的手段。如果在VM内出bug了的话调试也是解决问题的重要手段。再要说的话…这是兴趣驱动的
zjt5916 2011-05-21
RednaxelaFX 写道
zjt5916 写道
奥 我明白唠  可以用jni 然后自己封装出来几个神马WifiHelper类就可以了 
这样就可以做到扩展的目的
那我们调试hotspot的目的 在什么地方呢 调试它有什么作用呢 ?
  

这就要看你的目的了…
要了解内部实现方式,调试是一种有效的手段。如果在VM内出bug了的话调试也是解决问题的重要手段。再要说的话…这是兴趣驱动的


那如果想把jdk中 比如awt这些包砍掉 把它定制成我自己的jdk
这个该从那部分着手呢。
RednaxelaFX 2011-05-21
zjt5916 写道
那如果想把jdk中 比如awt这些包砍掉 把它定制成我自己的jdk
这个该从那部分着手呢。

只是要砍掉awt的话那在make的时候传个headless参数就好了。具体那个参数的拼写是什么我记不住了,抱歉。现在不在电脑上没办法帮你查。

如果是别的部分的话…感觉你关注的都是类库的裁剪,从jdk目录入手就好了。主要关注的是classes目录里面是Java代码,以及native目录里面是C写的JNI代码
zjt5916 2011-05-22
RednaxelaFX 写道
zjt5916 写道
那如果想把jdk中 比如awt这些包砍掉 把它定制成我自己的jdk
这个该从那部分着手呢。

只是要砍掉awt的话那在make的时候传个headless参数就好了。具体那个参数的拼写是什么我记不住了,抱歉。现在不在电脑上没办法帮你查。

如果是别的部分的话…感觉你关注的都是类库的裁剪,从jdk目录入手就好了。主要关注的是classes目录里面是Java代码,以及native目录里面是C写的JNI代码



好嘞  我打算先从外围入手 把它大卸八块 然后在逐步深入进去 我还是小白一个呢    
RednaxelaFX 2011-05-22
嗯,看了下应该是在make的时候传 BUILD_HEADLESS=true 就把AWT给干掉了。
zjt5916 2011-05-22
RednaxelaFX 写道
嗯,看了下应该是在make的时候传 BUILD_HEADLESS=true 就把AWT给干掉了。


大大  BUILD_HEADLESS=true 这句话在哪个makefile中呢呀  我没有找到
我在make的时候 还用过ALLOW_DOWNLOADS=true 我猜他俩应该在一个文件中
可是我就是没找到... 

还有大大 这样make出来的jdk是把AWT砍掉 那么在JVM中 它还有没有神马指令序列支持这部分功能呢 ...  如果还有支持的指令序列 这样的话 调用awt功能的java程序 在编译过后 加载到jvm中 它还依然可以执行 不知道我这样理解正不正确呢.
RednaxelaFX 2011-05-22
BUILD_HEADLESS是在jdk目录下的make相关文件里的。

AWT不是通过什么特别的指令序列来支持的。它就是个库而已。如果有使用了AWT的Java程序在headless的JDK上跑就会碰到异常。
Global site tag (gtag.js) - Google Analytics