GNU Cライブラリによれば、普通の変数と同じようにstdio
に割り当てることができます(これは拡張機能です)。プログラムを実行する場合は、予想通り、それはセグメンテーションフォールトます`stdio`がいつ変更されるのをgdbが見ないのですか?
#include <stdio.h>
int main()
{
stdout = NULL;
printf("Crash and %s\n", "burn");
return 0;
}
が、私は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)
しないのはなぜgdb
stdout
の正しい値を報告しますか?
(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
ここでは、次のようになります。これは、さらに私はstdio
としてgdb
レポートと同じだポインタを見つけるだろうがstruct _IO_FILE*
を探して、アドレス0x600940
でstdout
を保存するように見えることがわかり調査
gdb
はstdout
が0x7ffff7dd7d90
にあると考えますが、実際には0x600940
にあります。
私はGNU gdb (GDB) 7.4.1-debian
とgcc version 4.7.2 (Debian 4.7.2-5)
(x86-64)を使用しています。
私は 'struct _IO_FILE *)0x0'を期待通りに表示します。興味深いのは 'printf("%s "、" sd ");はうまくいきますが、printf("クラッシュと%s \ n " gdbの出力を表示してください。 – Downvoter
@cad私の 'gdb'出力から、あなたも私も含めなければならないと思いますか?あなたの所見はこれに関連していると思います。私が見つけたのは、 'puts'は' stdout'の割り当てを尊重していないようです( 'printf("%s "、" sd ");' 'printf'の代わりに' puts'を使います)。 – skyking
printfやputsフレームに入れずにプログラムを 'start'するだけなら、' print&stdout'の出力は何ですか? –