我正在尝试在 64 位 Windows 上使用 eclipse-Juno-CDT 和 cygwin-gcc(cygwin 版本=1.7.16,gcc 版本=3.4.4,gdb 版本=7.5.50)调试以下 C 代码。该代码在正常模式下工作正常。最初调试器没有运行,因为没有找到源文件。然后我四处搜索并添加了路径映射信息(从/cygdrive/c到C:\)。现在它正在运行,但存在以下问题:
我在“hello c 1”行之前放置了一个断点,然后单步执行。但是控制台上没有打印任何内容。
单步执行最后一行(“exit”)后,我收到错误:“没有可用的 _cygwin_exit_return() 源...”
// stdio.h and stdlib.h are included, but when I put a #include the code // they dont show up, so I deleted those lines in this code fragment. int main(void) { int a=10; int b=5; // breakpoint on this line, single step after this printf("hello c 1\n"); // these outputs are not printed in console // fflush(stdout); printf("A=%d, B=%d\n", a, b); // but debugger shows the correct values in data window // fflush(stdout); return EXIT_SUCCESS; // error on this line }
稍后添加:经过更多调试后,我认为即使在退出错误之后,如果我执行“继续”,那么我会在程序终止后在控制台上获取这些行。所以我添加了额外的“fflush(stdout)”行,现在我可以在打印时看到输出。
但是如何解决退出错误问题呢?此外,编辑文件以添加 fflush 以查看调试输出很痛苦 - 有没有办法避免这种情况?有人可以帮我解决这个非常基本的问题,或者指出提供解决方案的地方吗?提前致谢。
最佳答案
虽然 逻辑上 C 程序从 int main()
开始并在该函数返回时结束,但环境(如 Windows 或 Cygwin)经常添加前代码和后代码,用于初始化/分解内存管理,打开/关闭标准流,以及其他此类簿记。使用 Cygwin 编译的可执行文件,在从 int main()
返回后,切换到由 Cygwin 运行时提供的清理函数 _cygwin_exit_return()
- 您没有来源,因此您的调试器会提示。
至于立即获得输出,您可以使用无缓冲的输出流。
选项一,使用 fprintf( stderr, ... )
(因为 stderr
根据定义是无缓冲的)。但是,这也会影响程序的非调试行为。
选项二:
int main()
{
// Using NDEBUG as also used by <assert.h>; feel free to use a different define
#ifndef NDEBUG
// For debugging, set stdout to unbuffered
setbuf( stdout, NULL );
#endif
....
关于c - 使用 eclipse 和 cygwin 调试 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13380240/