2016-02-02 38 views
6

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.

+0

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

+0

@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

+0

Eğer programı başlatıyorsanız - printf'e girmeden veya çerçeveyi çıkarmadan - print & stdout'un çıkışı nedir? –

cevap

0

Gdb'nizin doğru şekilde çalıştığını düşünüyorum. Eğer alıntı bu satırlar bak:

_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) 

_IO_vfprintf_internal() imzası ilk parametre olarak hedef akışı s sahiptir. Yığınınızın farklı bir düzeyinde olduğunuz ve stdout genel bir değişken olmadığından yeniden atanır. Ancak ödevinizin s=0x0 nedeniyle tutulduğunu görebilirsiniz.