代码之家  ›  专栏  ›  技术社区  ›  yairchu

gdb+osx:重定向stdout可能会导致printf有一个2*14字节的缓冲区?

  •  2
  • yairchu  · 技术社区  · 15 年前

    我附加了一个在OSX中使用gdb的程序,我想使用 CFShow 但是,在gdb控制台等中,没有显示任何内容。 printf 也不显示任何内容:

    (gdb) call (int) printf("Hello\n")
    $10 = 6
    (gdb) call (int) printf("Hello World!\n")
    $11 = 13
    

    苹果建议 the following tip 当与gdb连接时,要使输出显示在gdb控制台中:

    (gdb) call (void) close(1)
    (gdb) call (void) close(2)
    (gdb) shell tty
    /dev/ttyp1
    (gdb) call (int) open("/dev/ttyp1", 2, 0)
    $1 = 1
    (gdb) call (int) open("/dev/ttyp1", 2, 0)
    $2 = 2
    

    在Xcode的gdb控制台中 tty 给予“ not a tty “,所以我在一个终端的gdb中尝试过。那里 TTY 确实有效,但是在重定向stdout之后仍然没有输出。如果我将stdout指向一个文件,也没有输出。:

    有救恩吗?

    更新/更多详细信息 :

    在某些程序(如textmate)上,此方法确实有效。我尝试调试的应用程序是 /Developer/Applications/Audio/AU\ Lab.app . 出于某种原因,这个把戏在那里不起作用。 更新:似乎真正的解释是:

    如果在附加后,我在调用前重定向stdout 普林特 第一次成功了!如果我第一次 普林特 只有这样才能重定向输出,只有在完成后才会显示输出 printf("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n") 然后按Enter(重复上一个命令)327次。

    所以我想重定向stdout会让libc困惑,并使其使用缓冲区 2**14 字节有什么原因吗?

    1 回复  |  直到 15 年前
        1
  •  1
  •   user8472    15 年前

    这个问题可能与您的设置的特殊性有关。下面是一些进一步的建议,您可以尝试确定问题的根源:

    1. 首先,检查调试程序的启动方式——您是在终端中使用命令行,还是通过一些可能提交超出您控制范围的其他命令行参数的GUI?(你提到过xcode,但我不明白你为什么要调试通过xcode提到的程序?实际上,我不知道Xcode是如何执行gdb的,所以现在请尝试使用终端!)

    2. 您的主目录中有init文件吗(一个名为 .gdbinit 或者这样)用一些您不知道的选项配置gdb?以下是GDB在启动时的操作说明: http://sourceware.org/gdb/current/onlinedocs/gdb/Startup.html#Startup

    3. 根据手册页,使用 -n 启动时的选项将阻止加载任何配置文件: http://sourceware.org/gdb/current/onlinedocs/gdb/Mode-Options.html#Mode-Options 如果使用此开关,问题是否仍然存在?

    4. 一组特定的命令涉及gdb的日志记录行为: http://sourceware.org/gdb/current/onlinedocs/gdb/Logging-Output.html#Logging-Output 你能执行吗? show logging 在控制台上检查输出会发生什么?

    5. 什么是输出 show inferior-tty ?如果设置为 "" 然后它将与您的gdb控制台相同(这很好)。否则,程序输出将转到其他地方,但这不能解释您在交互gdb命令中输出消失的问题!