在gdb中使用STDOUT

时间:2013-12-11 15:07:27

标签: c emacs gdb

我有一个非常打印数据结构的函数,它的函数原型是:

void print_mode(FILE *fp, Mode *mode);

FILE *允许您将输出重定向到您想要的任何位置,例如stdout,stderr,文件等。模式是数据结构

我试图在gdb中调用此函数,并希望将输出定向到gdb控制台窗口,stdout?

我试过了:

(gdb) p print_mode(STDOUT,fragment_mode)
No symbol "STDOUT" in current context.
(gdb) p print_mode(stdout,fragment_mode)
$17 = void

两者都不起作用

如何获得要在gdb控制台中显示的函数输出的任何想法?

应该添加 - 我在linux下的emacs 24.2.1中使用gdb

2 个答案:

答案 0 :(得分:1)

STDOUT似乎是宏,gdb不知道,因为预处理器在complilation之前处理过。

使用stdout可以胜任。

然而,函数print_mode()似乎没有打印出来。

根据正在调试的程序打印到控制台的内容,gdb的命令printcall应该没有区别。

有关详细信息,您可以在此处阅读:https://sourceware.org/gdb/onlinedocs/gdb/Calling.html


问题可能是默认情况下stdout是行缓冲的,因此在检测到换行符之前输出不会发生,而print_mode()可能不会发送换行符(\n)。

要测试这个,只需使用stderr作为输出文件,因为后者没有缓冲:

p print_mode(stderr, fragment_mode)

答案 1 :(得分:0)

哦,亲爱的 - 愚蠢的错误。你是对的,stdout确实做到了。

我忘了已经从emacs 23升级到24,gdb的工作方式发生了变化,因为它现在打开了一个单独的缓冲区*input/output of program-name*,它重定向被调试程序的输出。在以前版本的emacs中,它都显示在相同的单个gdb缓冲区中。

所以我的第二次尝试实际上正在工作,我只是在错误的地方寻找,所以没有看到输出