为什么gdb看不到'stdio`何时被更改?

sky*_*ing 6 c gdb gnu

根据GNU C库,它允许分配stdio就好像它们是普通变量(我知道这是一个扩展).我试过以下程序:

#include <stdio.h>
int main()
{
    stdout = NULL;

    printf("Crash and %s\n", "burn");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在运行程序时,它将按预期进行段错误,但是当我gdb以值运行时stdout仍然不是NULL:

_IO_vfprintf_internal (s=0x0, format=0x400631 "Crash and %s\n",    ap=0x7fffffffe210) at vfprintf.c:1297
1297    vfprintf.c: No such file or directory.
(gdb) print stdout
$1 = (struct _IO_FILE *) 0x7ffff7dd77a0
(gdb) 
Run Code Online (Sandbox Code Playgroud)

为什么不gdb报告正确的值stdout

进一步调查我发现它似乎存储stdout在地址0x600940,寻找struct _IO_FILE*那里我找到一个与gdb报告相同的指针stdio:

(gdb) print stdout
$1 = (struct _IO_FILE *) 0x7ffff7dd77a0
(gdb) print (void*)0x600940
$2 = (void *) 0x600940
(gdb) print (struct _IO_FILE*)0x600940
$3 = (struct _IO_FILE *) 0x600940
(gdb) print *(struct _IO_FILE**)0x600940
$4 = (struct _IO_FILE *) 0x7ffff7dd77a0
(gdb) n
7       puts("Crash and burn");
(gdb) print *(struct _IO_FILE**)0x600940
$5 = (struct _IO_FILE *) 0x0
(gdb) print &stdio
No symbol "stdio" in current context.
(gdb) print &stdout
$6 = (struct _IO_FILE **) 0x7ffff7dd7d90
Run Code Online (Sandbox Code Playgroud)

这看起来像gdb那些认为stdout位于0x7ffff7dd7d90,但在现实中它是位于0x600940.

我正在使用GNU gdb (GDB) 7.4.1-debiangcc version 4.7.2 (Debian 4.7.2-5)(x86-64).

Set*_*eth 0

我认为你的 gdb 运行正常。看看你引用的这些行:

_IO_vfprintf_internal (s=0x0, format=0x400631 "Crash and %s\n",    ap=0x7fffffffe210) at vfprintf.c:1297
1297    vfprintf.c: No such file or directory.
(gdb) print stdout
$1 = (struct _IO_FILE *) 0x7ffff7dd77a0
(gdb) 
Run Code Online (Sandbox Code Playgroud)

的签名_IO_vfprintf_internal()将目标流s作为第一个参数。因为您位于堆栈的不同级别并且stdout不是全局变量,所以它会被重新分配。但您可以看到您的任务成功了,因为s=0x0