जीएनयू सी लाइब्रेरी के अनुसार इसे 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
लगता है कि 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", जला) 'नहीं है। कृपया अपना जीडीबी आउटपुट दिखाएं। – Downvoter
@ कैड क्या यह मेरे 'जीडीबी' आउटपुट से कोई विशेष है जो आपको लगता है कि मुझे भी शामिल करना चाहिए? मुझे लगता है कि आपका अवलोकन इस से संबंधित हो सकता है, जो मुझे मिला है वह है कि 'puts' 'stdout' (' printf ("% s", "sd") के असाइनमेंट का सम्मान नहीं करता है; 'को अनुकूलित किया गया है 'printf' के बजाय' puts' का उपयोग करें)। – skyking
यदि आप प्रोग्राम को 'स्टार्ट' करते हैं - प्रिंटफ में जाने के बिना या फ्रेम डालता है - 'प्रिंट और स्टडआउट' का आउटपुट क्या है? –