Eclipse CDT控制台输出在带路径调试时不显示,在不带路径运行时也不显示

3
我正在尝试在Windows 7上使用GCC使Eclipse CDT(64位eclipse)正常工作。当我第一次成功运行GDB之后(这本身就是一个挑战),在调试模式下运行程序是我唯一得到输出的方法。正常运行时没有任何控制台输出。经过几个小时的谷歌搜索,我发现如果在eclipse中将C:/cygwin/bin添加到我的环境路径中,则可以在正常运行程序时获取输出。然后我在调试模式下运行它,但却没有输出。我测试了几次以确保问题是路径的添加导致的。这是我正在运行的程序。
#include <iostream>

using namespace std;

int main() {
    cout << "Hello World!" << endl;
    return 0;
}

那么我如何让正常模式和调试模式都能工作,为什么我必须首先包含该路径(它已经在我的Cygwin路径中,为什么CDT需要它?)?另外,如果我在运行配置中添加路径,为什么它也会被添加到调试配置中?


当你说“以调试模式运行程序”时,你是什么意思?在Eclipse中,你需要采取哪些操作才能实现这一点?你可以在调试视图中逐步执行代码,还是程序只是运行并输出到控制台? - Mike G
我所说的调试模式是指按下F11键(相当于在工具栏中单击错误图标),而正常运行它则是指按下Ctrl+F11键(相当于在工具栏中单击绿色播放按钮)。 - gsgx
但是你真的可以逐步执行程序吗? - Mike G
是的,如果我没有将Cygwin路径添加到我的运行配置中,并且显示了调试输出,我可以逐步执行程序。当我添加路径并且只能看到正常的运行输出而不是调试输出时,我显然无法逐步执行程序。但是,再次将cygwin路径添加到Windows路径而不是运行配置中即可解决所有问题。 - gsgx
嗯,好吧,如果你的问题已经解决了,那太好了。但我真的无法理解可能导致你所描述行为的原因。将路径添加到运行配置中应该只是将其附加到Windows路径中。也许这是一个错误,你的下一个更新或安装会修复它。祝你好运! - Mike G
5个回答

8

来自Eclipse CDT的信息: 在Windows上,由于程序的标准输出不是连接到Windows控制台而是连接到管道,因此运行或调试程序时标准输出将完全缓冲。有关更多详细信息,请参见错误173732。可以在每次printf之后添加flush调用,或者在主函数开始时添加以下行:

setvbuf(stdout, NULL, _IONBF, 0);
setvbuf(stderr, NULL, _IONBF, 0); 

6
我觉得我回答不了所有的问题,但我使用的设置与你完全相同,并且我也遇到过很多类似的问题(我在想你是否曾经遇到过如何同时使用32位/64位JVM和浏览器的问题)!
必须指定cygwin/bin路径,因为这是gcc、gdb和所有其他cygwin工具和dll所在的位置(我将假设您正在使用cygwin版本的gcc而不是MinGW版本)。我认为您必须在Windows环境中(使用win32文件路径)指定它,因为Eclipse正在使用Windows JVM运行,因此处理win32路径。因此,在cygwin环境中将cygwin/bin添加到PATH变量中无关紧要。CDT正在使用Eclipse查找cygwin,而Eclipse需要从Windows找到cygwin1.dll。
我可能完全错了,但如果我猜的话,我会说您需要确保正确设置了两个配置的PATH环境变量。
需要注意的一件事是,在Eclipse中,Debug Configurations窗口中显示的配置和Run Configurations窗口中具有相同名称的配置之间没有区别。两个窗口之间唯一的区别是一个将在不使用调试器的情况下运行程序并具有设置调试设置的选项卡。因此,更改其中一个的设置也会影响另一个。
正如您所知,对于许多项目,构建系统设置为生成两个(有时更多)二进制文件集:一个带有调试信息/符号(DEBUG),另一个不带(RELEASE)。在这种情况下,通常在Eclipse中有两个配置:一个用于运行DEBUG二进制文件,另一个用于运行RELEASE二进制文件。这两者都将显示在Debug Configurations窗口和Run Configurations窗口中。关键是您可以使用或不使用gdb运行DEBUG,但是不能使用gdb运行RELEASE。
话虽如此,我不确定添加正确路径到运行配置中为什么会阻止DEBUG二进制文件输出到控制台。我怀疑其他事情也在发生,也许是调试信息和调试器不匹配。
为了回答你的问题——如何使两个配置都运行正常,完全采取措施,只需将C:\cygwin\bin;添加到Windows PATH环境变量中即可。我猜那会让两个都起作用。我假设您知道如何执行此操作,但如果不知道,请在评论中发布。
尝试的另一件事是从cygwin shell编译和运行程序。如果它在那里工作,那么在使用eclipse时您的PATH环境变量可能没有正确设置。
希望能够帮到你!

由于Eclipse必须找到cygwin1.dll才能运行使用cygwin gcc编译的程序,因此进行了编辑。 - Mike G
首先,你的解决方案很简单,只需将C:\cygwin\bin路径添加到Windows路径中即可。其次,Eclipse仍然让我感到困惑。我正在将它添加到运行/调试配置中,但实际上添加到一个配置中也会添加到另一个配置中。我查看了我的项目首选项,发现已经定义了一个PATH变量,其中已经包含了cygwin路径... 所以简而言之,虽然Eclipse中的一切都不合理,但你的解决方案确实有效。 - gsgx
关于设置项目“PATH”变量的两段内容实际上是无关紧要的。我现在意识到,在C/C++ build->Environment页面设置的路径与此问题无关,因为(显然)该路径仅在编译/构建时使用。只要您的程序能够正确构建,更改该设置不应影响执行。我已相应地更新了我的答案。 - Mike G
很高兴我能提供帮助!如果在Windows路径中设置了cygwin/bin路径,那么问题显然是将Eclipse指向正确位置。但是,您应该能够在不更改Windows路径的情况下使用Eclipse复制此结果。我已经修改了我的答案,希望能更好地解释可能发生的情况。 - Mike G
在“值得一提”的类别中,Eclipse在运行/调试配置中维护其自己的环境变量集。虽然这样做可以通过隔离Eclipse环境变量和本地环境变量(即防止破坏关键的本地环境变量)来“帮助”,但它对于将stdout打印到Eclipse控制台并不“有用”(或直观)。对于Eclipse维护者的一个好建议是在运行配置中添加一个复选框,以便Eclipse自动导入本地环境变量。 - cowboydan

3

在gdb 7.3之前,添加路径是正确的。现在当我添加路径后,我不能再使用断点,因为它找不到dll文件,因为它们不再是路径的一部分。要解决这个问题,您可以按照以下说明轻松地从环境中添加整个路径。

left click the project
enter the RUN/DEBUG settings for the project
select the executable
click edit
select Environment Tab
click Select...
scroll down to Path (Case sensitive)
check mark Path
press OK
press OK
press OK

您可以在gdb控制台中看到dll问题出现的情况: 错误,消息="在启动期间,程序退出并显示代码0xc00000be。" 或者 错误,消息="在启动期间,程序退出并显示代码0x00000135。" 您可能会看到一个错误窗口弹出,说它无法清除断点。

似乎Path大小写在我更新环境变量路径时很重要,如:c:\cygwin\bin;${env_var:Path} - bvj

2

需要设置链接器 我正在使用MinGW。

按照以下步骤进行操作。

Goto Project > Properties > C/C++ Build > Settings > Tool Settings (Tab) > MinGW C++ Linker (Option) > Add Command (g++ -static-libgcc -static-libstdc++)   (default command is only g++)

谢谢,伙计!我以前每年都要搜索这个解决方案! - Tom Maier

0

如果您的C或C++应用程序的目标是Cygwin,请不要在Eclipse内部调试或运行。TK链接到“你会度过糟糕的时光”模因。

Cygwin的stdout/stderr存在问题,如果您从正常的Cygwin控制台(其中您将运行bash)运行程序,则不会显示这些问题,但几乎可以在其他任何方式下运行它们时显示出来。

Linux和其他支持posix环境中程序运行其他程序的正常方式是将i/o重定向到pty。Cygwin无法在Windows中100%支持pty。

@infoartenovo的答案中的setvbuf调用可以缓解一些问题。

这个问题的另一个方面是使用Windows的Console API编写的应用程序在pty中无法很好地工作。

我们都是一场不可赢得的战争中的牺牲品。

http://cygwin.com/ml/cygwin/2011-12/msg00236.html https://code.google.com/p/mintty/issues/detail?id=56


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接