【问题标题】:Can't continue stepping in debug mode when reaching "printf" in eclipse在eclipse中达到“printf”时无法继续进入调试模式
【发布时间】:2013-06-30 06:52:58
【问题描述】:

我正在尝试使用下一个代码在 eclipse 中调试 c:

void print_clause(SAT_clause * c) {
    int l_index;
    printf("(");
    for (l_index = 0; l_index < c->literal_count; l_index++) {
        print_literal(c->literal_arr[l_index]);
        if(l_index != c->literal_count - 1){
            printf(" v ");
        }
    }
    printf(")");
}

但每次我到达"printf("(");"(此函数中的第一个打印)时,我都会在控制台中收到下一条消息:
(*stopped,reason="end-stepping-range"...,然后我就不能再迈步了。我假设这是dbg eclipse 不能很好地解析的消息。我在某处读到我需要在printf 函数的末尾添加\n - 这确实有效,但我需要printf,最后没有\n。如果我在发布模式下运行 - 打印正常。
我做错了什么,我该如何继续在printf 之后执行?

更新好的 - 我发现了导致这种行为的原因(但我仍然有问题) - 这是因为这个链接:printf not printing on console。我添加了 setbuf(stdout, NULL);用于在调试中启用打印,但我无法执行。如果我删除这个 setbuf(stdout, NULL);由于缓冲区,我在调试模式下看不到 printf(但我可以继续单步执行)。 有什么建议

【问题讨论】:

  • 如果没有访问仍然重现错误的完整代码示例(尽可能少),可能没有人能告诉您。您是否尝试过 valgrind 来查找无效的内存访问?
  • 如果从print_clause 中删除循环,只留下printf("(")printf(")"),它的行为是否相同?
  • 一步完成后 GDB 的 "end-stepping-range" is the normal message。我不认为这个问题与在printf() 中有\n 是/否有关,因为GDB 不知道也不关心(GDB 步进和执行printf() 处于不同的级别)。
  • 我发现是因为我写了#ifndef NDEBUG //为了调试,设置stdout为unbuffered setbuf(stdout, NULL); #endif
  • 好的 - 我发现了导致这种行为的原因 - 这是因为 this-link 。我添加了 setbuf(stdout, NULL);用于在调试中启用打印。如果我删除这个 setbuf(stdout, NULL);我在调试模式下看不到 printf(但我可以继续单步执行)。有什么建议吗?

标签: c eclipse eclipse-cdt


【解决方案1】:

如果您点击链接到的链接和答案,您最终会访问:https://bugs.eclipse.org/bugs/show_bug.cgi?id=173732 归类为“不会修复”。

所以,如果这真的让您感到困扰,我的建议是在 Windows 上使用 Eclipse CDT 以外的其他东西,或者切换到 Eclipse CDT 可以正常运行的 POSIX 系统(Unix/Linux/BSD/Solaris...)。

另一个建议是尝试修复 Eclipse CDT,但我猜这并不容易,否则他们自己已经这样做了。 Windows 本身似乎缺少 CDT 为其控制台所依赖的“伪终端”功能。

我可以想到在 Eclipse CDT 中解决这个问题:在调试模式下注入您自己的 c-runtime 调试库和无缓冲的标准输出。我想这可以用相当于 LD_PRELOAD 的 Windows 来完成(虽然我不知道这在 Windows 世界中是什么样子,或者即使它是可行的)。

【讨论】:

  • 是的 - 我没有注意到......同时我找到了解决方法:我写了 - #define printf(args...) printf (args);\ fflush(stdout );
猜你喜欢
  • 1970-01-01
  • 2017-04-30
  • 2013-07-07
  • 2011-08-10
  • 2019-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多