gtk-gnutella logo
Τρέχουσα έκδοση: 1.2.3

HOWTO Αναφοράς Σφαλμάτων

Πως αρχειοθετώ μία χρήσιμη αναφορά σφάλματος;

Στους υπεύθυνους ανάπτυξης αρέσει πάρα πολύ να παίρνουν καλές αναφορές σφαλμάτων. Δυστυχώς για διάφορους λόγους οι αναφορές που παίρνουν συνηθως είναι άχρηστες. Να μερικές συμβουλές για τη δημιουργία αναφορών που θα βοηθήσουν να γίνει καλύτερο το gtk-gnutella. Η ιδανική αναφορά σφάλματος περιέχει ακριβώς τις πληροφορίες που χρειάζονται - ούτε περισσότερες ούτε λιγότερες - και συνοδεύονται από ένα μπάλωμα που διορθώνει το πρόβλημα. Αν Θέλετε να συμβάλλετε στην ανάπτυξη ενός μπαλώματος διαβάστε τη σελίδα ανάπτυξης και το Howto Ανάπτυξης. Οι περισσότεροι από εμάς, βέβαια, δεν έχουμε τα προσόντα ή/και το χρόνο να διορθώσουμε το gtk-gnutella. Δεν πειράζει όμως, ακόμα μπορούμε να βοηθήσουμε.

Να θυμάστε ότι τους υπεύθυνους ανάπτυξης τους ενδιαφέρουν αναφορές μόνο για την τελευταία έκδοση ή εκδόσεις που δημιουργήθηκαν από το τρέχον SVN. Οι υπεύθυνοι ανάπτυξης δημιουργούν τον κώδικα του gtk-gnutella όχι για χρήματα, αλλά επειδή το βρίσκουν μία ενδιαφέρουσα απασχόληση για τον ελεύθερο χρόνο και επειδή θέλεου να δώσουν κάτι στην κοινότητα ανοικτού κώδικα. Παρακαλούμε μην τους συμπεριφέρεστε σαν να ήταν κάποια εταιρία στην οποία πληρώσατε χρήματα και τώρα περιμένετε να σας προσφέρει υπηρεσίες. Η υποστήριξη των παλιών εκδόσεων είναι κάτι σαν "ήμουν εκεί, το έκανα, βαρετό" και οι νέες εκδόσεις είναι γενικά καλύτερες για εσάς και το gnet.

Ένα συχνό σφάλμα είναι ότι πολλοί δε δίνουν αρκετές πληροφορίες στην αναφορά τους. Οι υπεύθυνοι ανάπτυξης προτιμούν να ψάξουν τις αναφορές σφαλμάτων από το να μην πάρουν καθόλου αναφορές σφαλμάτων. Δεν έχουν χρόνο να εξάγουν πληροφοριές bit με bit από το χρήστη. Γι αυτό αν δεν είστε σίγουροι πείτε το. Μόλις ολοκληρώσετε την αναφορά σιγουρευτείτε ότι μένετε ενημερωμένοι καθώς κάποιος υπεύθυνος ανάπτυξης μπορεί να ζητήσει περισσότερες πληροφορίες. Αν το κάνει σιγουρευτείτε όι απαντάτε σε όλες τιες ερωτήσεις, ακόμα και αν η απάντηση είναι "Δεν ξέρω". Δεν υπάρχει τίποτα πιο μεγάλη απογοήτευση από το να γνωρίζες ότι έχεις ένα σφάλμα στο πρόγραμμά σου αλλά δεν έχεις αρκετές πληροφορίες για να το διορθώσεις.

Το πρώτο πράγμα που θέλουν να μάθουν οι υπύθυνοι ανάπτυξης είναι ποια είναι η έκδοση του gtk-gnutella που παρουσίασε το σφάλμα έτσι ώστε να γνωρίζουν ποια έκδοση του πηγαίου κώδικα έχει το πρόβλημα (και αν το σφάλμα έχει ήδη διορθωθεί.) Μπορείτε να αντιγράψετε αυτές τις πληροφορίες από το παράθυρο Σχετικά. Για παράδειγμα:

gtk-gnutella/0.92 (15/06/2003; X11; Linux 2.4.21 i586)

Αν είναι ένα πακέτο διανομής, αναφέρετε ποιας και από που το λάβατε. Για παράδειγμα:

I'm using the GTK2-gtk-gnutella_0.92.0-0_i386.deb package from the gtk-gnutella web site.

Αν είναι έκδοση CVS, χρησιμοποιήστε το ident ή αναζητήστε στο gtk-gnutella-current/src/CVS/Entries και κάντε επικόλληση την τελευταία υποβολή. Για παράδειγμα:

/support-glade2.c/1.5/Sat Jun 14 17:54:28 2003//

Αν το κάνατε compile μόνοι σας, αναφέρετε ποιες επιλογές ./Configure χρησιμοποιήσατε. Για παράδειγμα:

./Configure -Dprefix=/usr -Dccflags="-g -Wall" -Doptimize="-O2" -Dgtkversion=2 -ders

Αναφέρετε ποια διανομή τρέχετε και σε τι αρχιτεκτονική. Για παράδειγμα:

debian 2.2.22 on compaq alpha

Συμπεριλάβετε τις σχετικές πληροφορίες έκδοσης σε κάθε αναφορά.

Το gtk-gnutella κάνει κάτι λάθος ή απρόβλεπτο.

Αν το gtk-gnutella λειτουργεί όπως στόχευαν οι προγραμματιστές του αλλά εσείς επιθυμείτε κάτι διαφορετικό, τότε πρέπει να αρχειοθετήσετε ένα αίτημα χαρακτηριστικού και όχι μια αναφορά σφάλματος. Φυσικά, υπάρχουν και εξαιρέσεις - η λειτουργία μπορεί να είναι βλαβερή κατά απρόβλεπτο τρόπο ή να μην ανταποκρίνεται στα πρότυπα. Παρόλα αυτά, είναι δύσκολο να γνωρίζουμε τι ακριβώς στόχευε ο υπεύθυνος ανάπτυξης, έτσι δεν υπάρχει σύγκριση χαρακτηριστικό ή σφάλμα.

Αν αποφασίσετε ότι είναι σφάλμα, εξηγήστε ακριβώς τι κάνει λάθος το gtk-gnutella και τι πιστεύετε θα έπρεπε να κάνει. Η περιγραφή σας πρέπει να είναι αρκετά λεπτομερής ώστε να μπορεί κάποιος να αναπαράγει το σφάλμα που αναφέρετε. Σε ποιο παράθυρο ήσασταν και τι επιλογές είχατε επιλέξει; Ποιες είναι οι ακριβείς ενέργειες που οδήγησαν στο σφάλματ; Θα ήταν χρήσιμο να κρατήσετε κάποιες σημειώσεις πριν τα ξεχάσετε.

Το gtk-gnutella δε γίνεται compile!

Δεν αναφέρονται πολλά προβλήματα compile για το gtk-gnutella. Είναι γνωστό ότι γίνεται compile σε Linux, OS X, και FreeBSD με gcc. Αν έχετε προβλήματα, κάντε επικόλληση την τελευταία εντολή του compiler, για παράδειγμα:

gcc -DHAVE_CONFIG_H -I. -I. -I.. -I/usr/include/gtk-1.2 -I/usr/include/glib-1.2 -I/usr/lib/glib/include -I/usr/X11R6/include -I/usr/include/libxml2 -g -O2 -Wall -c nodes.c

και τα σφάλματα που προκάλεσε, μαζί με την έκδοση και τις επιλογές ρυθμίσεων που έχουν περιγραφεί.

Το gtk-gnutella κατέρρευσε! Τώρα τι γίνεται;

Για να αποσφαλματώσετε μία κατάρρευση, θα πρέπει το εκτελέσιμο να έχει κρατήσει άθικτα τα σύμβολα αποσφαλμάτωσής του. Δυστυχώς για την οικονομία χώρου σε σκληρό δίσκο και σε μνήμη τα σύμβολα αποσφαλμάτωσης συμπιέζονται από το gtk-gnutella όταν δημιουργείται ένα πακέτο διανομής. Τα πακέτα rpm, debian, και slackware στην ιστοσελίδα μεταφορτώσεων του gtk-gnutella είναι όλα συμπιεσμένα και δεν είναι ιδανικά για αποσφαλμάτωση. Αν όμως έχετε μία κατάρρευση κατά τη χρήση ενός πακέτου πάλι πρέπει να αναφέρετε το σφάλμα και το ακριβές μήνυμα σφάλματος έτσι ώστε οι άλλοι να μπορούν να προσπαθήσουν να το αναπαράγουν με ένα ασυμπίεστο εκτελέσιμο.

Αν τρέχετε το gtk-gnutella από xterm, θα βρείτε το μήνυμα σφάλματος στο παράθυρο τερματικό (ίσως χρειαστεί να το σύρετε προς τα πίσω.) Αν εκκινήσετε το gtk-gnutella από ένα εικονίδιο ή μενού, τότε θα βρείτε το μήνυμα σφάλματος όπου βρίσκεται η καταγραφής σφαλμάτων X. Ολόκληρο το μήνυμα σφάλματος και ειδικά οι τελευταίες 10 γραμμές που οδήγησαν στο σφάλμα θα πρέπει να επικολληθούν στην αναφορά σφάλματός σας. Αν είστε παρανοϊκοί (άλλωστε, είναι εκεί έξω και θα σας πιάσουν) μπορείτε να συσκοτίσετε τα ονόματα των αρχείων. Το σφάλμα θα το βρείτε μόνο αν το gtk-gnutella κλείσει, και όχι αν υπάρχει σφάλμα κατάτμησης έτσι θα πρέπει να πείτε σε ποια περίπτωση αναφέρεστε.

Ο πιο συνήθης λόγος που καταρρέει το gtk-gnutella είναι μια αποτυχία "συνθήκης". Οι συνθήκες είναι λογικές δηλώσεις που τοποθετούνται στρατηγικά μέσα στον στον κώδικα για να βοηθήσουν τους προγραμματιστές να βρουν τα σφάλματα. Θέτουν ότι πρέπει τη συνθήκη μια συνθήκη να ισχύει σε ένα συγκεκριμένο μέρος της εκτέλεσης του κώδικα πρέπει να ισχύει αλλιώς το πρόγραμμα δε συμπεριφέρεται όπως ο προγραμματιστής πιστεύει ότι θα έπρεπε. Για παράδειγμα μια συνθήκη θα μπορούσε να ισχυρίζεται ότι μία μεταβλητή θα πρέπει να έχει τουλάχιστον μία τιμή, π.χ. να μην έχει τιμή null: g_assert(header != NULL); ή ότι η τιμή της θα πρέπει να είναι σε κάποιο εύρος τιμών: g_assert(parq_ul->position > 0);. Αν η συνθήκη δεν ισχύει, το πρόγραμμα κλείνει με ένα μήνυμα σφάλματος που αναφέρει ποια συνθήκη δεν ισχύει και που ακριβώς είναι τοποθετημένη στον κώδικα. Για παράδειγμα:

** ΣΦΑΛΜΑ **: file parq.c: line 1138 (parq_upload_free): assertion failed: (parq_ul->by_ip->uploading <= parq_ul->by_ip->total)

Οι προγραμματιστές μπορούν να εξετάσουν τις τιμές και κατ'ευχήν να καταλάβουν ποιο είναι το σφάλμα που οδήγησε στη λανθασμένη τιμή. Ή μπορούν να προσθέσουν περισσότερες συνθήκες στον κώδικα μέχρι να απομονωθεί το πρόβλημα. Υπάρχουν περισσότερες από πεντακόσιες συνθήκες στον κώδικα του gtk-gnutella, οπότε καταλαβαίνετε γιατί οι προγραμματιστές θέλουν να αναφέρετε ολόκλητο το μήνυμα σφάλματος, συμπεριλαμβανομένου του αρχείου και του αριθμού γραμμής.

Αν χρησιμοποιείτε ένα πακέτο ή έχετε περιορίσει μόνοι σας το εκτελέσιμο gtk-gnutella δεν υπάρχουν πολλές πληροφορίες που μπορείτε να βρείτε από την κατάρρευση εκτός αν το κάνετε compile ξανά και αναπαράγετε το σφάλμα. Αν δε θέλετε να το κάνετε αυτό, αναφέρετε τις πληροφορίες που περιγράφηκαν μέχρι τώρα. Συνηθως δεν είναι αρκετές για να διορθωθεί το πρόβλημα αλλά τουλάχιστον είναι μία ένδειξη ότι υπάρχει ένα σφάλμα. Αν παρέχετε μία καθαρή περιγραφή, κάποιος άλλος ίσως μπορέσει να αναπαράγει το σφάλμα με μία έκδοση αποσφαλμάτωσης του gtk-gnutella.

Αν κάνατε μόνοι σας compile το gtk-gnutella τότε προεπιλεγμένα, θα γίνει compile με την επιλογή -O στον compiler, ενώ η εντολή make install θα περιορίσει το εκτελέσιμο. Για τη δυνατότητα αναφοράς σφαλμάτων πρέπει να το κάνετε compile με -g3 -O0 για να λαμβάνετε σύμβολα αποσφαλμάτωσης για παράδειγμα:

./Configure -O -Dccflags="-g3 -Wall" -Doptimize="-O0" -ders

Δεν υπάρχει τρόπος να πείτε στο make install να μην περιορίσει το εκτελέσιμο, έτσι πρέπει να αντιγράψετε μη περιορισμένη έκδοση πάνω από την εγκατεστειμένη. Για παράδειγμα:

su -c 'install -m 555 src/gtk-gnutella /usr/local/bin/gtk-gnutella'

Όταν καταρρέει το gtk-gnutella, θα πετάξει ένα αρχείο "πυρήνα" που περιέχει μία εικόνα του πόση μνήμη χρησιμοποίησε, συμπεριλαμβανομένων όλων των τιμών που διατηρούνταν στη μνήμη τυχαίας προσπέλασης εκείνη τι στιγμή. Το αρχείο έπειτα μπορεί να φορτωθεί στον αποσφαλματωτή gdb ώστε να ερευνηθεί η κατάσταση του gtk-gnutella τη στιγμή της κατάρρευσης. Βέβαια, οι περισσότερες διανομές έχουν προεπιλεγμένα απενεργοποιημένες αυτές της αναφορές πυρήνα. Μπορείτε να τις ενεργοποιήσετε με την εντολή κελύφους ulimit -S -c unlimited, η οποία θα επηρεάσει μόνο εκείνο το τερματικό, ή μπορείτε να τοποθετήσετε την εντολή στο αρχείο ρυθμίσεων του κελύφους σας (π.χ., ~/.profile ή ~/.cshrc) για να τις επιτρέπετε παγκόσμια. Τα νέα αρχεία πυρήνα θα αντικαταστήσουν τα παλιότερα έτσι ίσως να θέλετε να τα μετακινήσετε σε ασφαλή τοποθεσία. Το αρχείο πυρήνα θα βρίσκεται στον αρχικό σας κατάλογο ή στον κατάλογο από όπου καλέσατε το gtk-gnutella μέσω τερματικού. Αν θέλετε να ασχοληθείτε σοβαρά με τα σφάλματα του gtk-gnutella ίσως θέλετε να χρησιμοποιήσετε κάτι σαν το ακόλουθο σενάριο για να το εκκινείτε. Πρέπει να το τροποποιήσετε για να ταιριάζει στο σύστημά σας φυσικά. Για παράδειγμα το αρχείο πυρήνα θα μπορούσε να ονομαστεί "core", "gtk-gnutella.core", "core.[PID]", κτλ.

#!/bin/sh

# This is where the configuration stuff is stored.
#export GTK_GNUTELLA_DIR=$HOME/.gtk gnutella

# Turn on core dumps and delete old dump and log
ulimit -S -c unlimited
rm -f core gtk-gnutella.log

# Run gtk-gnutella and redirect output to a log file
# The log could get quite large if your uptime is long.
# To just keep output in the terminal use:
# gtk-gnutella
# instead and remove the other log references.
gtk-gnutella >gtk-gnutella.log 2>&1

# If a core is dumped, create a uniquely named directory
# to save the core, log and executable
if [ -e core ] ; then
  Core_Save_Dir=$(date "+core%Y.%m.%d.%H.%M.%S")
  mkdir $Core_Save_Dir
  cp $(which gtk-gnutella) $Core_Save_Dir
  cp core $Core_Save_Dir
  cp gtk-gnutella.log $Core_Save_Dir
fi

Εντάξει, τώρα που έχετε ένα μη περιορισμένο εκτελέσιμο και ένα αρχείο πυρήνα, μπορείτε να χρησιμοποιήσετε τον αποσφαλματωτή gdb για την ανίχνευση του σφάλματος. Σημειώστε ότι σε αυτό το παράδειγμα το εκτελέσιμο gtk-gnutella και ο πυρήνας αποθηκεύονται στον ίδιο κατάλογο.

~/src/test/core2003.06.12.18.01.40> gdb -c core ./gtk-gnutella
GNU gdb 5.2
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-slackware-linux"...
Core was generated by `gtk-gnutella'.
Program terminated with signal 6, Aborted.
Reading symbols from /usr/lib/libgtk-1.2.so.0...done.
Loaded symbols for /usr/lib/libgtk-1.2.so.0
Reading symbols from /usr/lib/libgdk-1.2.so.0...done.
Loaded symbols for /usr/lib/libgdk-1.2.so.0
Reading symbols from /usr/lib/libgmodule-1.2.so.0...done.
Loaded symbols for /usr/lib/libgmodule-1.2.so.0
Reading symbols from /usr/lib/libglib-1.2.so.0...done.
Loaded symbols for /usr/lib/libglib-1.2.so.0
Reading symbols from /lib/libdl.so.2...done.
Loaded symbols for /lib/libdl.so.2
Reading symbols from /usr/X11R6/lib/libXext.so.6...done.
Loaded symbols for /usr/X11R6/lib/libXext.so.6
Reading symbols from /usr/X11R6/lib/libX11.so.6...done.
Loaded symbols for /usr/X11R6/lib/libX11.so.6
Reading symbols from /lib/libm.so.6...done.
Loaded symbols for /lib/libm.so.6
Reading symbols from /usr/lib/libz.so.1...done.
Loaded symbols for /usr/lib/libz.so.1
Reading symbols from /usr/lib/libxml2.so.2...done.
Loaded symbols for /usr/lib/libxml2.so.2
Reading symbols from /lib/libc.so.6...done.
Loaded symbols for /lib/libc.so.6
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2
Reading symbols from /usr/X11R6/lib/X11/locale/common/xlcDef.so.2...done.
Loaded symbols for /usr/X11R6/lib/X11/locale/common/xlcDef.so.2
Reading symbols from /usr/X11R6/lib/X11/locale/common/ximcp.so.2...done.
Loaded symbols for /usr/X11R6/lib/X11/locale/common/ximcp.so.2
Reading symbols from /lib/libnss_compat.so.2...done.
Loaded symbols for /lib/libnss_compat.so.2
Reading symbols from /lib/libnsl.so.1...done.
Loaded symbols for /lib/libnsl.so.1
Reading symbols from /lib/libnss_db.so.2...done.
Loaded symbols for /lib/libnss_db.so.2
Reading symbols from /lib/libnss_files.so.2...done.
Loaded symbols for /lib/libnss_files.so.2
Reading symbols from /lib/libdb-3.1.so...done.
Loaded symbols for /lib/libdb-3.1.so
#0 0x4036b2f1 in kill () from /lib/libc.so.6
(gdb)

Εντάξει, τώρα ας κάνουμε μια πλήρη ανίχνευση:

(gdb) bt full
#0 0x4036b2f1 in kill () from /lib/libc.so.6
No symbol table info available.
#1 0x4036afbc in raise () from /lib/libc.so.6
No symbol table info available.
#2 0x4036c7cb in abort () from /lib/libc.so.6
No symbol table info available.
#3 0x4018f9de in g_logv () from /usr/lib/libglib-1.2.so.0
No symbol table info available.
#4 0x4018fa91 in g_log () from /usr/lib/libglib-1.2.so.0
No symbol table info available.
#5 0x0814efda in parq_upload_free (parq_ul=0x8d62328) at parq.c:1138
No locals.
#6 0x0814d696 in parq_close () at parq.c:416
        queues = (GList *) 0x0
        dl = (GList *) 0x0
        sl = (GSList *) 0x8a20040
        remove = (GSList *) 0x8a204b8
        removeq = (GSList *) 0x8a204c0
#7 0x0811f3a4 in gtk_gnutella_exit (n=0) at main.c:113
        now = 1055466099
        tick = 143511256
#8 0x080d7eba in quit (force=0) at main_cb.c:44
        confirm = 0
#9 0x080d7f04 in on_button_quit_clicked (button=0x8358d44, user_data=0x0) at main_cb.c:62
No locals.
#10 0x400b10d5 in gtk_marshal_NONE__NONE () from /usr/lib/libgtk-1.2.so.0
No symbol table info available.
#11 0x400e091c in gtk_signal_remove_emission_hook () from /usr/lib/libgtk-1.2.so.0
No symbol table info available.
#12 0x400dfd85 in gtk_signal_set_funcs () from /usr/lib/libgtk-1.2.so.0
No symbol table info available.
#13 0x400dde63 in gtk_signal_emit () from /usr/lib/libgtk-1.2.so.0
No symbol table info available.
#14 0x401149be in gtk_widget_activate () from /usr/lib/libgtk-1.2.so.0
No symbol table info available.
#15 0x400b9534 in gtk_menu_shell_activate_item () from /usr/lib/libgtk-1.2.so.0
No symbol table info available.
#16 0x400b87ba in gtk_menu_shell_deactivate () from /usr/lib/libgtk-1.2.so.0
No symbol table info available.
#17 0x400b0d5f in gtk_marshal_BOOL__POINTER () from /usr/lib/libgtk-1.2.so.0
No symbol table info available.
#18 0x400dfdc3 in gtk_signal_set_funcs () from /usr/lib/libgtk-1.2.so.0
No symbol table info available.
#19 0x400dde63 in gtk_signal_emit () from /usr/lib/libgtk-1.2.so.0
No symbol table info available.
#20 0x4011487b in gtk_widget_event () from /usr/lib/libgtk-1.2.so.0
No symbol table info available.
#21 0x400b0ca5 in gtk_propagate_event () from /usr/lib/libgtk-1.2.so.0
No symbol table info available.
#22 0x400afe0e in gtk_main_do_event () from /usr/lib/libgtk-1.2.so.0
No symbol table info available.
#23 0x4015f047 in gdk_wm_protocols_filter () from /usr/lib/libgdk-1.2.so.0
No symbol table info available.
#24 0x4018d258 in g_main_dispatch () from /usr/lib/libglib-1.2.so.0
No symbol table info available.
#25 0x4018d863 in g_main_iterate () from /usr/lib/libglib-1.2.so.0
No symbol table info available.
#26 0x4018d9fc in g_main_run () from /usr/lib/libglib-1.2.so.0
No symbol table info available.
#27 0x400af707 in gtk_main () from /usr/lib/libgtk-1.2.so.0
No symbol table info available.
#28 0x080d7cf2 in main_gui_run () at main_gui.c:650
        coord = {0, 0, 1276, 965}
#29 0x0811fc2b in main (argc=1, argv=0xbffff924, env=0xbffff92c) at main.c:463
        i = 256
#30 0x4035a17d in __libc_start_main () from /lib/libc.so.6
No symbol table info available.

Επικολλήστε την ανίχνευση στην αναφορά σφάλματος σας.

Οι υπεύθυνοι ανάπτυξης πιθανώς να χρειάζονται και άλλες πληροφορίες αλλά εφόσον έχουν την ανίχνευση και άλλες πληροφορίες, μπορούν να κάνουν μια καλή αρχή. Ίσως να σας ζητήσουν να χρησιμοποιήσετε το gdb ξανά ώστε να τυπώσετε κάποιες συγκεκριμένες τιμές που θέλουν. Βέβαια, για επιπλέον πόντους μπορείτε να προλάβετε τις ανάγκες τους. Αν γνωρίζετε C, μπορείτε να ρίξετε μια ματιά στον κώδικα και να αποφασίσετε τις να συμπεριλάβετε αλλά και χωρίς να γνωρίζετε C, μπορείτε να μαντέψετε βλέποντας τη συνθήκη. Σε αυτό το παράδειγμα το μήνυμα σφάλματος ήταν:

** ΣΦΑΛΜΑ **: file parq.c: line 1138 (parq_upload_free): assertion failed: (parq_ul->by_ip->uploading <= parq_ul->by_ip->total)

Κοιτώντας την ανίχνευση, ψάχνετε στο #5 parq.c:1138, την ίδια σειρά όπου είναι τοποθετημένη η συνθήκη, έτσι ας εξετάσουμε μερικές τιμές σε αυτή την περιοχή:

(gdb) frame 5
#5 0x0814efda in parq_upload_free (parq_ul=0x8d62328) at parq.c:1138
1138          g_assert(parq_ul->by_ip->uploading <= parq_ul->by_ip->total);

Πρώτα, ας τυπώσουμε τις τιμές των μελών του parq_ul.

(gdb) p * parq_ul
$1 = {magic = 1782120609, flags = 10, position = 1735, relative_position = 1, has_slot = 0, had_slot = 0, eta = 81,
  expire = 1055465788, retry = 1055465787, enter = 1055465787, updated = 1055465787, ban_timeout = 1055466387,
  disc_timeout = 0, last_queue_sent = 0, queue_sent = 0, queue_refused = 0, is_alive = 0,
  id = 0x8a15af8 "6cad90dc1f0edd94f5d0e991cc89f25e",
  ip_and_name = 0x8a16578 "3521280541 Somethingorother.mp3",
  name = 0x8a16583 "Somethingorother.mp3", remote_ip = 3521280541, file_size = 2652639,
  chunk_size = 1005329, ip = 0, port = 0, major = 0, minor = 0, queue = 0x84f85c8, by_ip = 0x86259e8}

Κοιτάξτε ότι το τελευταίο μέλος της λίστας είναι το by_ip = 0x86259e8. Η συνθήκη εξετάζει δύο μέλη του parq_ul->by_ip οπότε ας τυπώσουμε τις τιμές τους.

(gdb) p * parq_ul->by_ip
$2 = {uploading = 2, total = 1, ip = 3521280551, list = 0x8bb639c}

Εκεί βρίσκονται οι τιμές που ο υπεύθυνος ανάπτυξης ψάχνει: parq_ul->by_ip->uploading = 2 και parq_ul->by_ip->total = 1. Επειδή το 2 <= 1 είναι λάθος, η συνθήκη δεν ισχύει. Τώρα ο υπεύθυνος ανάπτυξης μπορεί να προσπαθήσει να καταλάβει τι πήγε λάθος.

Ποιό είναι το καλύτερο μέρος για την υποβολής της αναφοράς σφάλματός μου;

Μπορείτε να αναφέρετε το σφάλμα σας χρησιμοποιώντας το SourceForge.net Bug Tracker ή μπορείτε να στείλετε την αναφορά σας με email στην ταχυδρομική λίστα gtk-gnutella-devel. Επίσης μπορείτε να βρείτε έναν υπεύθυνο ανάπτυξης στο IRC στο δίκτυο Freenode network στο κανάλι #gtk-gnutella.

ΤΟ IRC μπορεί να αποδειχθεί χρήσιμο για μια γρήγορη απάντηση αν πετύχετε έναν υπεύθυνο ανάπτυξης στο κανάλι, αλλά είναι εύκολο να ξεχαστούν τα σφάλματα αν αναφερθούν μόνο εκεί. Είναι ένα καλό μέρος όμως να πάτε αν δεν είστε σίγουροι αν το πρόβλημά σας είναι σφάλμα ή όχι. Είναι το τέλειο μέρος να πάτε αν έχετε ήδη κάνει αναφορά σφάλματος στη λίστα ή το bug tracker και θέλετε να μάθετε αν οι υπεύθυνοι ανάπτυξης θέλουν περισσότερες πληροφορίες από εσάς. Τη στιγμή συγγραφής αυτών των γραμμών, όλοι υ υπεύθυνοι ανάπτυξης ζούσαν στη ζώνη ώρας Κεντρικής Ευρώπης (CET)(UTC+1). Μπορείτε να τους βρείτε για μια γρήγορη ερώτηση το πρωί πριν τη δουλειά αλλά η καλύτερη ώρα είναι τα απογεύματα ή τα σαββατοκύριακα. Μπορείτε να δείτε την καταγραφή IRC για να πάρετε μια μια ιδέα του πότε θα βρείτε άτομα στο κανάλι. Οι ώρες που είναι στη λίστα καταγραφής είναι επίσης σε UTC+1.

Η ταχυδρομική λίστα υπευθύνων ανάπτυξης είναι ένα καλό μέρος για την τοποθέτηση κρίσιμων σφαλμάτων όπως οι καταρρεύσεις, αν και μπορείτε να χρησιμοποιήσετε και το bug tracker. Περισσότεροι θα διαβάσουν την αναφορά σφάλματος στη λίστα από ότι στο bug tracker και ίσως είναι λίγο πιο βολικό για την ανάγνωση ανιχνεύσεων κτλ. Από την άλλη Τα σφάλματα που αναφέρονται στη λίστα μπορούν να ξεχαστούν πιο εύκολα από αν υποβληθούν στο bug tracker. Πρέπει να κάνετε εγγραφή στο για να SourceForge εγγραφείτε στο gtk-gnutella-devel, αλλά δε χρειάζετα να είστε εγγεγραμμένοι για να στείλετε ένα μήνυμα. Αν στείλετε ένα μήνυμα στην ταχυδρομική λίστα, ή προσθέστε την ηλεκτρονική σας διεύθυνση στην κεφαλίδα Απάντηση-σε: ή αναφέρετε ότι δεν είστε εγγεγραμμένοι.

Το καλύτερο μέρος υποβολής σφαλμάτων είναι το SourceForge bug tracker. Άλλωστε, αυτός είναι και ο λόγος ύπαρξής του. Ψάξτε το λίγο για να δείτε μήπως το σφάλμα σας έχει ήδη αναφερθεί, και αν ναι, προσθέστε την αναφορά σας ως σχόλιο και όχι ως υποβολή νέου σφάλματος. Πρέπει να εγγραφείτε στο SourceForge και να έχετε εισέλθει για να μπορείτε να υποβάλλετε ένα σφάλμα.

Μόλις υποβάλλετε την αναφορά σας μην την ξεχάσετε. Η αναφορά σφάλματός σας δεν έχει ολοκληρωθεί μέχρι να απαντήσετε όλες της ερωτήσεις των υπευθύνων ανάπτυξης που θα ακολουθήσουν. Αυτοί που υποβάλλουν αναφορές σφαλμάτων χωρίς να απαντούν στις ερωτήσεις που ακολουθούν είναι άκρως εκνευριστικοί για τους υπεύθυνους ανάπτυξης. Μπορεί η χρήση λογισμικού αποσφαλμάτωσης να απογοητεύει του υπεύθυνους αποσφαλμάτωσης αλλά η λήψη καλών αναφορών σφαλμάτων μπορεί να βοηθήσει στο να γίνει η δημιουργία δωρεάν λογισμικού πιο ικανοποιητική.

Users Love Us Community Choice SF Favourite Community Leader Open Source Excellence SourceForge.net Logo RSS Feed Available Open Hub metrics Coverity Scan Build Status gtk-gnutella at GitHub
gtk-gnutella © 2000-2014 των Yann Grossel, Raphaël Manfredi και άλλων που συνέβαλλαν.