[费时费力]Eclipse+CDT的一个Bug

       我的电脑硬盘资源有限,所以没有装Visual Studio,但是看到有趣的C/Cpp的程序又想运行来看看,就装了MinGW和CDT。MinGW用的是MinGW-3.1.0-1版本(我试过4.1.0版本,好像和Eclipse没什么配合),和一般的软件装法一样。CDT是使用Eclipse自带的插件安装模式(find and install)安装的,不用配置。接下来可以在环境变量中添加MinGW的相关内容,也可以写一个简单的批处理文件(把Java、C、Cpp的路径全部加到环境变量里面显得有些臃肿,我觉得写bat更好)。

      这样配置之后,就可以在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,就跟见网友看到恐龙一样正常,不过今天这一路下来,还是搞得本座精神崩溃……

Lenciel,男的,活的。是一个高尚的,纯粹的,有道德的,坚决不脱离低级趣味的人。-查看简介
144 readers
subscribe via RSS
447 followers
follow on sina


About this entry