GNU C kitaplığına göre, stdio
'a, sıradan değişkenlermiş gibi atanmaları için izin verilir (bunun bir uzantı olduğunu biliyorum). beklendiği gibi program segfault olacak çalıştırırkenNeden stdio'nun değiştiğini gdb görmüyor?
#include <stdio.h>
int main()
{
stdout = NULL;
printf("Crash and %s\n", "burn");
return 0;
}
ama gdb
onu çalıştırdığınızda stdout
değeri hala NULL
geçerli:: Aşağıdaki programı denedik
_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)
Neden gdb
değil stdout
doğru değeri bildirin
Ben orada ben stdio
olarak gdb
raporları aynı olan işaretçi bulacağını bir struct _IO_FILE*
arayan, adres 0x600940
de stdout
saklamak görünmektedir görüyoruz bu ileri incelenmesi: benzediğini İşte
(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
gdb
, stdout
'un 0x7ffff7dd7d90
adresinde olduğunu düşünür, ancak gerçekte 0x600940
adresinde bulunur.
GNU gdb (GDB) 7.4.1-debian
ve gcc version 4.7.2 (Debian 4.7.2-5)
(x86-64) kullanıyorum.
Bu, beklendiği gibi (struct _IO_FILE *) 0x0' için yazdırır. Ayrıca ilginç olan printf ("% s", "sd"), iyi çalışıyor, ancak printf ("Crash ve% s \ n", ") yazmıyor. Gdb çıktınızı gösterin lütfen. – Downvoter
@cad Bunu da içermem gerektiğini düşündüğüm gdb' çıktısından özel bir şey var mı? Ben senin gözlemin bununla ilgili olabileceğini düşünüyorum, bulduğum şey "koyarsın" stdout'un ("printf" ("% s", "sd") atamalarına saygı göstermiyor gibi görünüyor; "printf" yerine "koyar" kullanın. – skyking
Eğer programı başlatıyorsanız - printf'e girmeden veya çerçeveyi çıkarmadan - print & stdout'un çıkışı nedir? –