Εντομολογία. GIT Bisect.

Πρόσφατα έπεσα “θύμα” μιας δυσλειτουργίας (;) στον πυρήνα Linux (3.9.x) που χωρίς προφανή λόγο (το σύστημα δεν έκανε κάτι, σχεδόν μηδενική χρήση του επεξεργαστή) μετά από επαναφορά από κατάσταση αδρανοποίησης στην RAM (suspend to RAM) η θερμοκρασία του επεξεργαστή ανέβαινε πάνω από 10 βαθμούς, η συχνότητα λειτουργία κολλούσε στο μέγιστο (frequency scaling) και η μπαταρία άντεχε μόλις 2 περίπου ώρες (από τις 4~5 που αντέχει).

bug hunting

Άρθρο της Wikipedia για το Git.
Manual του Git.
Manual του Git-Bisect.

Έπρεπε με κάποιον τρόπο τα βρεθεί λύση σε αυτό το σφάλμα (Bug). Ξεκίνησα λοιπόν ένα θέμα στην λίστα με τα σφάλματα (bug report) που αφορούν τον πυρήνα Linux. Αρχικά οι υποψίες μου έπεσαν στο Intel PSTATE (που πέρασε στον πυρήνα με την έκδοση 3.9) και στο acpifreq. Όλες οι προσπάθειες να εντοπιστεί το bug απέτυχαν. Μία λύση απέμενε. Το GIT Bisect. πρόκειται για μία μέθοδος που προσφέρει το λογισμικό διαχείρισης πηγαίου κώδικα Git για των εντοπισμό σφαλμάτων. Θα περιγράψω συνοπτικά την διαδικασία που μπορεί να ακολουθήσει κάποιος.

Το πρώτο πράγμα που πρέπει να κάνει κάποιος είναι να κατεβάσει τον πηγαίο κώδικα του προγράμματος που τον ενδιαφέρει σε “git μορφή”, εφόσον ο πηγαίος κώδικας διαχειρίζεται από το git. Στο παράδειγμα του πυρήνα Linux εκτελούμε την εντολή.

git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git linux-git

Η εντολή αυτή θα δημιουργήσει έναν φάκελο με όνομα linux-git και εκεί θα κατεβάσει τον πηγαίο κώδικα. Το δεύτερο πράγμα που μας ενδιαφέρει είναι οι διακριτές εκδόσεις του κώδικα που μπορούμε να δουλέψουμε. Για τον λόγο αυτό μπαίνουμε στον φάκελο που δημιουργήθηκε στο παραπάνω βήμα και εκτελούμε την εντολή git tag. Βλέπουμε την έξοδο παρακάτω.

git tag

Ήξερα πως το πρόβλημα είναι μεταξύ των εκδόσεων 3.8 και 3.9. Ήθελα όμως να το περιορίσω περισσότερο (διαφορετικά θα έπρεπε να “κτίσω” 14 φορές τον πυρήνα). Με 2~3 δοκιμές κατάφερα να το περιορίσω στις “δοκιμαστικές” εκδόσεις 3.9-rc1 και 3.9-rc2. Μπορούσα τώρα να ξεκινήσω το git bisect. Δίνουμε με την σειρά τις παρακάτω εντολές.

git bisect start
git bisect good v3.9-rc1
git bisect bad v3.9-rc2

git bisect start

Στην συνέχεια μπορείτε να “κτίσετε” τον κώδικα που υπάρχει στον φάκελο. Για ευκολία μπορείτε να μεταφέρετε τον κώδικα αυτό σε κάποιον άλλον φάκελο (όχι όμως τον κρυφό φάκελο .git που δεν χρειάζεται). Προσωπικά χρησιμοποιώ το rsync για να μεταφέρω τον κώδικα από τον κατάλογο του git στον κατάλογο που κάνω το compile.

rsync -rptLv –progress –exclude=.git* linux-git/ linux-build/

Αφού “κτίσουμε” και δοκιμάσουμε την συγκεκριμένη έκδοση κώδικα που δημιούργησε το git bisect, πρέπει να περάσουμε στο git bisect το αποτέλεσμα. Αν η έκδοση είναι χωρίς πρόβλημα δίνουμε την εντολή git bisect good. Αν η έκδοση έχει το πρόβλημα που ψάχνουμε, δίνουμε την εντολή git bisect bad. Αν για οποιονδήποτε λόγο δεν μπορούμε να “κτίσουμε” ή να δοκιμάσουμε την έκδοση αυτή, δίνουμε την εντολή git bisect skip. Στην δική μου περίπτωση ήταν χωρίς το πρόβλημα.

git bisect good

Η νέα έκδοση είχε το πρόβλημα.

git bisect bad

Αφού εκτελέσουμε και το τελευταίο βήμα (μετά από “κτισίματα” και δοκιμές του kernel) που (στην δική μου περίπτωση) ήταν χωρίς το πρόβλημα.

bad commit

Βρήκαμε λοιπόν το πρόβλημα: drm/i915: enable irqs earlier when resuming. Μοιάζει να είναι αρκετά σχετικό αφού το πρόβλημα μου προέκυπτε μετά από resume και η κάρτα γραφικών που είναι ενσωματωμένη στον επεξεργαστή (και ελέγχεται από το i915) θα μπορούσε εύκολα να οδηγεί σε αύξηση θερμοκρασίας και κατανάλωσης. Παρακάτω είναι το patch της συγκεκριμένης αλλαγής.

Εντολή git diff 15239099d7a7a9ecdc1ccb5b187ae4cda5488ff9.

git diff

Στην τελευταία έκδοση του πυρήνα που χρησιμοποιεί η διανομή μου (Arch Linux με kernel 3.9.4) αφαίρεσα την παραπάνω αλλαγή και όλα καλά. Το πρόβλημα εξαφανίστηκε. Ενημέρωσα και σχετικά τους developers του συγκεκριμένου κομματιού του πυρήνα και περιμένω νέα τους.

Advertisements
This entry was posted in GNU/Linux and tagged , , , , , , , , , , , , , , , , . Bookmark the permalink.

2 Responses to Εντομολογία. GIT Bisect.

  1. psyxroskianapodos says:

    3.9 !! είμαστε αρκετά πίσω σας
    headless@centurion:~$ uname -a
    Linux centurion 3.2.0-4-amd64 #1 SMP Debian 3.2.41-2 x86_64 GNU/Linux

    Δεν ζηλεύω καθολου όσους τρέχουν Linux σε laptop, τρώνε στη μάπα όλα τα μυστήρια προβλήματα με acpi,suspend,θερμοκρασίες etc.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s