【问题标题】:using STDOUT from within gdb在 gdb 中使用 STDOUT
【发布时间】:2013-12-11 15:07:27
【问题描述】:

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

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

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

我正在尝试从 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

【问题讨论】:

  • 尝试查看info terminalrun > redirect-filetty device-name。会有设备名称相当于标准输入、标准输出、ala /dev/tty
  • 试试call print_mode(stdout,fragment_mode)而不是p print_mode(stdout,fragment_mode)
  • STDOUT 可以是宏吗?找出它扩展的内容。
  • @anishsane:就程序本身打印的内容而言,printcall 应该没有任何区别。
  • 让我们检查一下stdout是否有一个合理的值。 gdb 中的call fprintf(stdout, "test %d\n", 5) 是否产生输出?

标签: c emacs gdb


【解决方案1】:

STDOUT 似乎是宏,GDB 不知道,在编译之前由预处理器处理。

使用stdout 应该可以完成这项工作。

但是函数print_mode() 似乎根本没有打印出任何东西。

就被调试程序打印到控制台的内容而言,GDB 的命令 printcall 应该没有区别。

有关这方面的详细信息,您可能想在这里阅读:https://sourceware.org/gdb/onlinedocs/gdb/Calling.html


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

要对此进行测试,只需使用 stderr 作为输出文件,因为后者没有缓冲:

p print_mode(stderr, fragment_mode)

【讨论】:

    【解决方案2】:

    天哪 - 愚蠢的错误。你是对的,stdout 确实可以完成这项工作。

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

    所以我的第二次尝试确实有效,我只是看错了地方,所以没有看到输出

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2011-11-02
      相关资源
      最近更新 更多