这样配置之后,就可以在Eclipse下面编译运行C/Cpp源文件了。不过我发现编译完成在运行的时候,会发生奇怪的现象,就是控制台中经常看不到任何输出。如果一个台灯,有时能按亮有时又不行,就不是使用者的技巧或者安装的问题,而是坏在台灯本身。所以我想这大概不是我的配置有问题,而是Eclipse或者CDT的一个Bug。我试了附近版本的Eclipse,好像也会这样,程序的输出就像段誉的六脉神剑,可遇不可求。
根据我的观察,在Eclipse中用“Run | Run… | C/C++ Local Application”的方式启动程序,就会这样,而切换到命令行下运行又一切正常。在Eclipse的日志文件里面一看,有这样的记录:
!SESSION 2005-12-27 13:34:06.450 -----------------------------------------------
eclipse.buildId=M20050929-0840
java.version=1.5.0_06
java.vendor=Sun Microsystems Inc.
BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=zh_CN
Command-line arguments: -os win32 -ws win32 -arch x86
!ENTRY org.eclipse.core.resources 2 1 2005-12-27 13:34:23.614
!MESSAGE Skipping builder org.springframework.ide.eclipse.core.
springbuilder for project toWeb. Either the builder is missing from the install,
or it belongs to a project nature that is missing or disabled.
!ENTRY org.eclipse.debug.core 4 120 2005-12-27 13:34:23.965
!MESSAGE Error logged from Debug Core:
!STACK 0
java.io.IOException: ¾ıúÎÞЧ¡£
at org.eclipse.cdt.utils.spawner.SpawnerInputStream.read0(
Native Method)
at org.eclipse.cdt.utils.spawner.SpawnerInputStream.read(
SpawnerInputStream.java:60)
at java.io.BufferedInputStream.read1(Unknown Source)
at java.io.BufferedInputStream.read(Unknown Source)
at java.io.FilterInputStream.read(Unknown Source)
at org.eclipse.debug.internal.core.OutputStreamMonitor.read(
OutputStreamMonitor.java:137)
at org.eclipse.debug.internal.core.OutputStreamMonitor.access(
OutputStreamMonitor.java:127)
at org.eclipse.debug.internal.core.OutputStreamMonitor.run(
OutputStreamMonitor.java:193)
at java.lang.Thread.run(Unknown Source)
!ENTRY org.eclipse.debug.core 4 120 2005-12-27 13:34:23.965
!MESSAGE Error logged from Debug Core:
!STACK 0
java.io.IOException: ¾ıúÎÞЧ¡£
at org.eclipse.cdt.utils.spawner.SpawnerInputStream.read0(
Native Method)
at org.eclipse.cdt.utils.spawner.SpawnerInputStream.read(
SpawnerInputStream.java:60)
at java.io.BufferedInputStream.read1(Unknown Source)
at java.io.BufferedInputStream.read(Unknown Source)
at java.io.FilterInputStream.read(Unknown Source)
at org.eclipse.debug.internal.core.OutputStreamMonitor.read(
OutputStreamMonitor.java:137)
at org.eclipse.debug.internal.core.OutputStreamMonitor.access(
OutputStreamMonitor.java:127)
at org.eclipse.debug.internal.core.OutputStreamMonitor.run(
OutputStreamMonitor.java:193)
at java.lang.Thread.run(Unknown Source)
可见,一切的问题都出在Spawner这里。我想,可能是因为Eclipse下面使用Run命令的时候,调用的是命令其实是:
org.eclipse.cdt.launch.internal.LocalRunLaunchDelegate.exec( )而Eclipse的控制台读取输出信息的时候,调用的则是:
org.eclipse.cdt.internal.core.model.Binary.openBuffer( )由于两个线程不同步,很可能在run完之后线程1就马上自尽,而read就只能读出一部分甚至根本读不出结果。可是我在程序里面加了sleep之后,问题依然如故。我只能猜,可能是因为使用Run的时候,Eclipse把文件写入管道中(pipe( )),使用的是file buffer,而对printf这样的函数来说,使用的是line buffer。
尽管弄到最后我也不知道原因,不过这个Bug倒是可以“解决”的。在Eclipse的plugin下面搜索spawner.dll,然后把它删除(或者改个名字), Eclipse就会因为找不到它,而使用自带的java.lang.Runtime.exec()来启动程序,这样就可以看到正常的输出了。需要注意的是,修改后Spawner类提供的interrupt, hangup, kill, terminate或者isRunning这样的函数,也就随之失效。
虽然心里知道,用开源的东西遇到Bug,就跟见网友看到恐龙一样正常,不过今天这一路下来,还是搞得本座精神崩溃……


2 Comments
Jump to comment form | comments rss [?] | trackback uri [?]