【发布时间】: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