eclipse的hot swap功能失效导致代码修改后必须重启web应用:Absent Line Number Information

很长时间一直被ecipse的hotSwap功能失效问题困扰,hotSwap是jvm的一个重要功能,它可以让你在正在运行的程序中,修改方法体内容,修改后的代码能在应用不重启的条件下生效。而且经常提示这样的错误:

Absent Line Number Information

The virtual machine was unable to remove all stack frames running old code from the call stack. The virtual machine is not supplying the debugger with valid data for those frames. Stepping into these obsolete frames may be hazardous to the target virtual machine

hotSwap这个功能能大大降低开发调试成本。可是原本eclipse中能正常工作的hotSwap功能居然不能用了。在网上找了很多的方案,基本都是在说Preferences –> Java –> Compiler –> Classfile Generation的几项要勾上。但是eclipse默认这几项就是勾上的。

经查阅n多资料后,发现其本质原因是虚拟机和调试器不配套。说明很可能有两套javac.exe(用来编译的)和jdb.exe(用来调试的)同时被使用了,而这两套还不是来自同一个jdk的。顺着这个思路,我查看了下我的环境变量,在cmd中敲”echo %PATH%”:

C:\Program Files (x86)\Common Files\NetSarang;D:\amd\AMD APP SDK\2.9\bin\x86_64;D:\amd\AMD APP SDK\2.9\bin\x86;C:\Program Files (x86)\AMD APP SDK\2.9\bin\x86_64;C:\Program Files (x86)\AMD APP SDK\2.9\bin\x86;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;D:\software\apache-maven-3.0.5\bin;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;%GOBIN%;C:\Program Files (x86)\Git\cmd;%GROOVY_HOME%\bin;C:\Program Files\TortoiseSVN\bin

jdk只配置了一个,看起来没什么异样。我尝试用everything软件在整个硬盘上搜索javac.exe,结果发现有两个javac.exe,一个在jdk下,还有一个在%SystemRoot%\system32下,而且这个system32目录下还有个java.exe。看来问题应该是在这里了,至于为什么system32下会有javac.exe,就不得而知了,把java相关的exe文件都删除后,再试了试果然hotSwap功能恢复了。

困扰我许久的问题终于被解开了。

Reference

http://stackoverflow.com/questions/957822/eclipse-unable-to-install-breakpoint-due-to-missing-line-number-attributes

Post Footer automatically generated by wp-posturl plugin for wordpress.



好书推荐:Java Web开发实战