2016-02-02 10 views
6

जीएनयू सी लाइब्रेरी के अनुसार इसे stdio को असाइन करने की अनुमति है जैसे कि वे सामान्य चर थे (मुझे पता है कि यह एक एक्सटेंशन है)। मैं निम्नलिखित कार्यक्रम की कोशिश की:जीडीबी क्यों नहीं देखता है जब `stdio` बदल जाता है?

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

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

    return 0; 
} 

जब चल रहा है के रूप में उम्मीद कार्यक्रम यह SEGFAULT जाएगा, लेकिन जब मैं 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 के सही मूल्य की रिपोर्ट करें?

इस आगे मुझे लगता है कि यह वहाँ मैं एक सूचक है कि stdio रूप gdb रिपोर्ट की तरह ही है पाते हैं पता 0x600940 पर stdout स्टोर करने के लिए, एक struct _IO_FILE* की तलाश में लग रहे हैं जांच:

(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 लगता है कि stdout0x7ffff7dd7d90 पर स्थित है, लेकिन वास्तव में यह 0x600940 पर स्थित है।

मैं GNU gdb (GDB) 7.4.1-debian और gcc version 4.7.2 (Debian 4.7.2-5) (x86-64) का उपयोग कर रहा हूं।

+0

यह मेरे लिए अपेक्षित रूप से '(struct _IO_FILE *) 0x0' प्रिंट करता है। यह भी दिलचस्प है कि 'printf ("% s", "sd");' ठीक काम करता है लेकिन 'printf ("क्रैश और% s \ n", जला) 'नहीं है। कृपया अपना जीडीबी आउटपुट दिखाएं। – Downvoter

+0

@ कैड क्या यह मेरे 'जीडीबी' आउटपुट से कोई विशेष है जो आपको लगता है कि मुझे भी शामिल करना चाहिए? मुझे लगता है कि आपका अवलोकन इस से संबंधित हो सकता है, जो मुझे मिला है वह है कि 'puts' 'stdout' (' printf ("% s", "sd") के असाइनमेंट का सम्मान नहीं करता है; 'को अनुकूलित किया गया है 'printf' के बजाय' puts' का उपयोग करें)। – skyking

+0

यदि आप प्रोग्राम को 'स्टार्ट' करते हैं - प्रिंटफ में जाने के बिना या फ्रेम डालता है - 'प्रिंट और स्टडआउट' का आउटपुट क्या है? –

उत्तर

0

मुझे लगता है कि आपका जीडीबी सही तरीके से काम कर रहा है। इन पंक्तियों आप उद्धृत को देखो:

_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() के हस्ताक्षर पहले पैरामीटर के रूप गंतव्य धारा s है। क्योंकि आप अपने ढेर के एक अलग स्तर पर हैं और stdout वैश्विक चर नहीं है, इसे फिर से असाइन किया जाता है। लेकिन आप देख सकते हैं कि आपका असाइनमेंट हो गया क्योंकि s=0x0

संबंधित मुद्दे