背景:
这里应该写一些远程调试功能的重要意义的。官话不多说,有时候源码上无法重现,产品的的bug,远程调试将提供更多的信息。
我所在小组负责维护的RCP产品,通过Eclipse导出的产品可以进行远程调试。但是通过linux服务器 导出的产品可以监听到相关线程,源码断点和高亮显示位置不对。但通常服务器打出的产品才是会被大范围使用的。so,得解决问题。
PS:关于如何通过服务器打版。可以参考:Eclipse help中 Plug-in Development Environment Guide->Tasks 下的相关内容
知识准备:
java文件先通过编译产生.class文件 该文件是程序运行时的真正文件。也是java跨平台的原因。
.class文件会自动忽略java文件中的注释信息
.class文件中可以包含行号信息。(行号信息等同于debug信息)这个信息可以在导出产品时指定
远程调试是基于行号信息的。简单的理解就是在jvm运行.class的某一行时,将信息发送给开启远程调试的Eclipse,然后Eclipse通过该信息找到相关的行
这也就解释了,如果源码和运行的产品不匹配,也是可以远程调试的,只是源码上的提示的位置很可能不对。
问题解决:
问题现在已经很明确了,我本地打版.class携带了行号信息。服务器版本没有携带。
你可能会问我是怎么读的二进制文件? 答案:反编译工具
我用的jd-gui 如果没有行号,左侧的数字就没了。(PS:11行我进行了注释,但注释被过滤了)
对比我将编译的命令改为: javac -g:none TestLineNumber.java (-g:none 意思是:不生成任何的调试信息)
打开效果如下:
不仅不显示行号,而且注释行的空隙也给占了。
注:调试信息不只包括行号信息,还有变量信息,源文件信息等 自己搜吧
言归正传,通过简单的javac的命令已经可以控制debug信息了。 RCP产品只是java语言的高级应用。所以找到相关配置区域就可以了。
Eclipse导出产品配置:window->preferences->java->Compiler 复选框:add line number attributes to generated class files 简单明了吧
人家还是默认勾选了 够体贴吧 当然你也可以看看其他的选项 间接在介绍调试信息有哪些
服务器配置:是通过ant来打出产品的,没有可视化。
位置为:build.properties文件中
# Whether or not to include debug info in the output jars (体贴的注释)
javacDebugInfo=true <- 这就是开关