1

我正在尝试在 64 位 Windows 上使用 eclipse-Juno-CDT 和 cygwin-gcc(cygwin 版本=1.7.16,gcc 版本=3.4.4,gdb 版本=7.5.50)调试以下 C 代码。该代码在正常模式下工作正常。最初调试器没有运行,因为找不到源文件。然后我四处搜索并添加了路径映射信息(从/cygdrive/c到C:\)。现在它正在运行,但存在以下问题:

  1. 我在“hello c 1”行之前放了一个断点,然后单步执行。但是控制台上没有打印任何内容。

  2. 在最后一行(“exit”)上单步后,我收到错误:“No source available for _cygwin_exit_return() at ...”

    // 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 以查看调试输出是一种痛苦——有没有办法避免这种情况?有人可以帮助我解决这个非常基本的问题,或者将我指向一个给出解决方案的地方吗?提前致谢。

4

2 回答 2

4

虽然从逻辑上讲,C 程序在该函数返回时开始int main()并结束,但环境(如 Windows 或 Cygwin)经常添加前代码和后代码,用于初始化/分解内存管理、打开/关闭标准流以及其他此类簿记。使用 Cygwin 编译的可执行文件在从 中返回后int main(),会切换到_cygwin_exit_return()由 Cygwin 运行时提供的清理功能 - 您没有源代码,因此您的调试器会报错。

至于立即获取输出,您可以使用无缓冲的输出流。

选项一,使用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
    ....
于 2012-11-14T14:44:16.173 回答
0

当我学习多线程时,我很好奇线程是否比进程快,而 iirc 我甚至不得不在 Windows 上刷新 stderr/stdout。

除了记忆之外,您可以将这些 printf() 包装在一个调用 fflush 的函数中,或者调用 setvbuf() 来禁用缓冲。

关于退出:“无可用源”仅表示您的程序的一部分缺少调试信息,因此这不是一个真正的错误——除非您自己构建 cygwin,否则我猜 cygwin dll 被剥夺了调试符号。或者,也许你想调试 cygwin 的 exit()?

编辑:废话,并发答案:)

于 2012-11-14T14:51:36.960 回答