2011-01-30 4 views
5

हो सकता है कि यह बहुत देर हो चुकी है, लेकिन मुझे कम से कम उत्सुकता मिलती है कि निम्नलिखित कुछ पंक्तियां विभाजन की गलती का कारण बन रही हैं अगर केवल जीसीसी के अनुकूलन के साथ संकलित होने पर, "-ओ 1" भी!एक साधारण जीटीके + एप्लिकेशन में ऑप्टिमाइज़ेशन सक्षम करते समय सेगमेंटेशन गलती?

(gdb) backtrace 
#0 0x00007ffff4d88052 in ??() from /lib/libc.so.6 
#1 0x00007ffff5304112 in g_strdup() from /lib/libglib-2.0.so.0 
#2 0x00007ffff5bc799d in ??() from /usr/lib/libgobject-2.0.so.0 
#3 0x00007ffff5ba826c in g_object_new_valist() 
    from /usr/lib/libgobject-2.0.so.0 
#4 0x00007ffff5ba84f1 in g_object_new() from /usr/lib/libgobject-2.0.so.0 
#5 0x00007ffff78502d5 in gtk_button_new_from_stock() 
    from /usr/lib/libgtk-x11-2.0.so.0 
#6 0x00007ffff787cc95 in gtk_dialog_add_button() 
    from /usr/lib/libgtk-x11-2.0.so.0 
#7 0x00007ffff787cd60 in ??() from /usr/lib/libgtk-x11-2.0.so.0 
#8 0x00007ffff787cf60 in gtk_dialog_new_with_buttons() 
    from /usr/lib/libgtk-x11-2.0.so.0 
#9 0x0000000000402bb9 in show_settings_dialog() at settings.c:24 
#10 0x0000000000403328 in main (argc=1, argv=0x7fffffffe2b8) at gatotray.c:286 

... settings.c: 24 वास्तव में ऊपर सूचीबद्ध पहली पंक्ति, "gtk_dialog_new_with_buttons" दोषी है की तरह लगता है है ...

settings_dialog = gtk_dialog_new_with_buttons("gatotray Settings" 
    , NULL, 0, GTK_STOCK_CANCEL, FALSE, GTK_STOCK_SAVE, TRUE, 0); 
g_signal_connect(G_OBJECT(settings_dialog), "response", G_CALLBACK(gtk_widget_destroy), NULL); 
g_signal_connect(G_OBJECT(settings_dialog), "destroy", G_CALLBACK(settings_destroyed), NULL); 
GtkWidget *vb = gtk_dialog_get_content_area(GTK_DIALOG(settings_dialog)); 
GtkWidget *hb = gtk_hbox_new(FALSE, 3); 
gtk_container_add(GTK_CONTAINER(hb), gtk_label_new("Background:")); 
GtkWidget *cb = gtk_color_button_new(); 
gtk_container_add(GTK_CONTAINER(hb), cb); 
gtk_container_add(GTK_CONTAINER(vb), hb); 

यह पश्व-अनुरेखन है संस्करण:
जीसीसी: 4.4.3
जीटीके +: 2.20.1

Btw, कि सह उल्लेख करना भूल गया के बाद कुछ पंक्तियों को mmenting 0 विरोधाभासी कॉल इसे होने से रोकता है। विशेष रूप से "gtk_container_add (GTK_CONTAINER (एचबी), सीबी) के साथ रेखा;"

मैंने जीटीकेटीप्स/जीटीके_MACROS के लगभग सभी उपयुक्त संयोजनों की कोशिश की, इससे कोई फर्क नहीं पड़ता।

+0

क्या आप संकलित करते समय कोई चेतावनी प्राप्त करते हैं? – dreamlax

+1

बेशक कोई चेतावनी नहीं! :-) "gcc -c' 'pkg-config --cflags gtk + -2.0'' -std = c99 -Wall -O1 -ggdb" -> – gatopeich

+1

इस बीच, मैंने पाया कि परिवर्तनीय तर्क में अतिरिक्त 0 जोड़ना gtk_dialog_new_with_buttons() की सूची समस्या को हल करने लगती है, भले ही यह इसके दस्तावेज़ के अनुरूप न हो। अगर हम va_args, अनुकूलन, और/या इस विशिष्ट मुद्दे के बारे में अधिक आधिकारिक स्पष्टीकरण नहीं प्राप्त करते हैं, तो मैं इसका उत्तर दूंगा: -पी। – gatopeich

उत्तर

3

लंबी कहानी कम: शून्य का उपयोग जब मैनुअल का कहना है शून्य, और एक सादे नहीं !

(जब से मैं एक जवाब के रूप में टिप्पणी नहीं चुन सकते हैं, मैं इस सवाल का जवाब अपने आप को लिख रहा हूँ, उपयोगी टिप्पणी करने के लिए ऋण देने ...)

जीटीके + प्रलेखन राज्यों इस:

GtkWidget* 
gtk_dialog_new_with_buttons (const gchar *title, 
          GtkWindow  *parent, 
          GtkDialogFlags flags, 
          const gchar *first_button_text, 
         ...); 

title : Title of the dialog, or NULL. allow-none. 
parent : Transient parent of the dialog, or NULL. allow-none. 
flags : from GtkDialogFlags 
first_button_text : stock ID or text to go in first button, or NULL. allow-none. 
... : response ID for first button, then additional buttons, ending with NULL 

लेकिन मैं आलसी है कि रात थी और टाइप सिर्फ एक '0' जहां शून्य की उम्मीद थी:

settings_dialog = GTK_DIALOG(gtk_dialog_new_with_buttons("gatotray Settings" 
    , NULL, 0, GTK_STOCK_CANCEL, FALSE, GTK_STOCK_SAVE, TRUE, 0)); 

... देख ऐसा नहीं है कि शून्य एक बिंदु है एर जो मेरी 64-बिट सिस्टम में 64-बिट चौड़ा है, जबकि 0 32-बिट पूर्णांक है ...

इसके अलावा, चर तर्क तर्क सूची में लगता है कि संकलक असंगतता का पता लगाने में सक्षम नहीं था: कोड चुपचाप संकलित - वाल।

Myforwik सुझाव दिया गया है और Havoc P आगे '0' की बजाय 'न्यूल' का उपयोग करके स्पष्ट किया गया है। धन्यवाद दोस्तों!

रिकॉर्ड के लिए, मैंने 32 बिट्स मोड में संकलन परीक्षण किया जहां न्यूल 32-बिट्स भी है, और उस स्थिति में कोई सीगफॉल्ट नहीं था। हालांकि यह अभी भी गलत है, क्योंकि दस्तावेज पर्याप्त स्पष्ट है, और न्यूल 0 नहीं है, इससे कोई फर्क नहीं पड़ता कि सी ++ समितियों ने कभी क्या कहा है! ;-)

+3

कुंजी * गॉचा * यहां परिवर्तनीय तर्क सूची है - एक सी संकलक किसी भी शाब्दिक '0' को 'न्यूल' सूचक में बदल देगा ** जब यह जानता है ** आपको एक सूचक की आवश्यकता है - और यह नहीं कर सकता (जरूरी) पता है कि एक varargs invocation संकलित करते समय! – detly

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