Εισαγωγή GDB:
Το GDB είναι ένα ισχυρό εργαλείο εντοπισμού σφαλμάτων προγράμματος UNIX που κυκλοφόρησε από τον Οργανισμό Ανοιχτού Κώδικα GNU. Εάν εργάζεστε στην πλατφόρμα UNIX, θα διαπιστώσετε ότι το GDB είναι ένα εργαλείο εντοπισμού σφαλμάτων που έχει πιο ισχυρές λειτουργίες από τους γραφικούς αποσφαλματωτές των VC και BCB.
ζήτημα
Περιβάλλον: Linux/PHP v5.5.7
Όταν το κινητό τηλέφωνο αποκτήσει πρόσβαση στο φόντο αυτού του ιστότοπου, κάντε κλικ σε ορισμένες σελίδες και θα εμφανιστεί το σφάλμα 502 και θέλετε να μάθετε ποιος είναι ο συγκεκριμένος λόγος για το σφάλμα 502.
Το αρχείο καταγραφής σφαλμάτων PHP-FPM έχει ως εξής:
WARNING: [pool www] child 11274 exited on signal 11 (SIGSEGV) after 0.089068 seconds from start
Βασικό αρχείο
Το αρχείο πυρήνα είναι στην πραγματικότητα μια εικόνα της μνήμης, η οποία αποθηκεύει τις αντίστοιχες πληροφορίες της μνήμης όταν το πρόγραμμα διακόπτεται και χρησιμοποιείται κυρίως για τον εντοπισμό σφαλμάτων του προγράμματος. Όταν το πρόγραμμα διακοπεί, θα δημιουργηθεί ένα αρχείο πυρήνα, στην πραγματικότητα, θα πρέπει να ειπωθεί ότι είναι ένα αρχείο ένδειξης πυρήνα, η προεπιλεγμένη θέση δημιουργίας βρίσκεται στον ίδιο κατάλογο με το εκτελέσιμο πρόγραμμα, το όνομα του αρχείου είναι πυρήνας.***, όπου *** είναι ένας συγκεκριμένος αριθμός.
Εντολή:
Μέγεθος αρχείου πυρήνα (μπλοκ, -c) 0 Μέγεθος seg δεδομένων (kbyte, -d) απεριόριστο Προτεραιότητα προγραμματισμού (-e) 0 μέγεθος αρχείου (μπλοκ, -f) απεριόριστο Σήματα σε εκκρεμότητα (-i) 7271 Μέγιστη κλειδωμένη μνήμη (kbyte, -l) 64 μέγιστο μέγεθος μνήμης (kbyte, -m) απεριόριστο Άνοιγμα αρχείων (-n) 65535 Μέγεθος σωλήνα (512 byte, -p) 8 Ουρές μηνυμάτων POSIX (byte, -q) 819200 Προτεραιότητα σε πραγματικό χρόνο (-r) 0 Μέγεθος στοίβας (kbyte, -s) 8192 Χρόνος CPU (δευτερόλεπτα, -t) απεριόριστος Μέγιστος αριθμός διεργασιών χρήστη (-u) 7271 Εικονική μνήμη (kbyte, -v) απεριόριστη κλειδώματα αρχείων (-x) απεριόριστα Εάν το μέγεθος του αρχείου πυρήνα είναι 0, το αρχείο πυρήνα δεν μπορεί να δημιουργηθεί και πρέπει να το ορίσουμε.
ulimit -c απεριόριστο, σημαίνει ότι το μέγεθος του αρχείου πυρήνα είναι απεριόριστο
Η εγκατάσταση ολοκληρώθηκε, θυμηθείτεΕπανεκκινήστε την υπηρεσία php-fpm, η εντολή είναι η εξής:
Ελέγξτε ξανά το αρχείο καταγραφής σφαλμάτων, ως εξής:
[23-Μαΐου-2020 14:39:14] ΠΡΟΕΙΔΟΠΟΙΗΣΗ: [pool www] παιδί 2220 βγήκε στο σήμα 11 (SIGSEGV - ο πυρήνας απορρίφθηκε) μετά από 7,255225 δευτερόλεπτα από την έναρξη [23-Μαΐου-2020 14:39:14] ΕΙΔΟΠΟΙΗΣΗ: [pool www] παιδί 2231 ξεκίνησε Εάν το αρχείο καταγραφής περιέχει τις λέξεις "SIGSEGV – core dumped", σημαίνει ότι το αρχείο rore έχει δημιουργηθεί με επιτυχία.
Το βασικό αρχείο θα δημιουργηθεί κάτω από τον κατάλογο του ιστότοπου, αν δεν το γνωρίζετε, μπορείτε επίσης να βρείτε το βασικό αρχείο με την ακόλουθη εντολή:
Η διεύθυνση που δημιουργείται από τον πυρήνα του διακομιστή μου είναι: /alidata/www/itsvse_web/core.2220
Εγκαταστήστε το gdb
Η εντολή είναι η εξής:
Εντοπισμός σφαλμάτων GDB PHP-FPM
Προετοιμάστε το αρχείο .gdbinit
Το αρχείο .gdbinit βρίσκεται κάτω από τον πηγαίο κώδικα της PHP και πρέπει να είναι συνεπές με την έκδοση php που εκτελείτε!
Η διεύθυνση του αρχείου μου: /root/sh-1.5.5/php-5.5.7/.gdbinit
Διεύθυνση λήψης της τελευταίας έκδοσης php του αρχείου .gdbinit:
Η σύνδεση με υπερσύνδεσμο είναι ορατή.
gdb για να ανοίξετε το βασικό αρχείο
Στον κατάλογο αρχείων πυρήνα, εκτελέστε την ακόλουθη εντολή:
[root@o itsvse_web]# gdb php-fpm -c πυρήνας.2220 GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-119.el7 Πνευματικά δικαιώματα (C) 2013 Free Software Foundation, Inc. Άδεια GPLv3+: GNU GPL έκδοση 3 ή μεταγενέστερη <Η σύνδεση με υπερσύνδεσμο είναι ορατή. Αυτό είναι ελεύθερο λογισμικό: είστε ελεύθεροι να το αλλάξετε και να το αναδιανείμετε. ΔΕΝ ΥΠΑΡΧΕΙ ΕΓΓΥΗΣΗ, στο βαθμό που επιτρέπεται από το νόμο. Πληκτρολογήστε "εμφάνιση αντιγραφής" και "εμφάνιση εγγύησης" για λεπτομέρειες. Αυτό το GDB διαμορφώθηκε ως "x86_64-redhat-linux-gnu". Για οδηγίες αναφοράς σφαλμάτων, δείτε: <Η σύνδεση με υπερσύνδεσμο είναι ορατή. Ανάγνωση συμβόλων από το /alidata/server/php-5.5.7/sbin/php-fpm... Έγινε. [Νέο LWP 2220] [ Εντοπισμός σφαλμάτων νήματος με χρήση libthread_db ενεργοποιημένο ] Χρήση κεντρικού libthread_db βιβλιοθήκης "/lib64/libthread_db.so.1". Ο πυρήνας δημιουργήθηκε από το 'php-fpm: pool www '. Το πρόγραμμα τερματίστηκε με το σήμα 11, Σφάλμα τμηματοποίησης. #0 tsrm_realpath_r ( path=path@entry=0x7ffdd9ebf100 "/alidata/www/itsvse_web/./source/language/mobile/lang_template.php", έναρξη=start@entry=1, len=66, ll=ll@entry=0x7ffdd9ebf0f4, t=t@entry=0x7ffdd9ebf0f8, use_realpath=use_realpath@entry=2, is_dir=is_dir@entry=0, link_is_dir=link_is_dir@entry=0x0) στο /root/sh-1.5.5/php-5.5.7/TSRM/tsrm_virtual_cwd.c:751 751 { Λείπουν ξεχωριστές πληροφορίες εντοπισμού σφαλμάτων, χρησιμοποιήστε: debuginfo-install cyrus-sasl-lib-2.1.26-23.el7.x86_64 glibc-2.17-307.el7.1.x86_64 keyutils-libs-1.5.8-3.el7.x86_64 krb5-libs-1.15.1-46.el7.x86_64 libcom_err-1.42.9-17.el7.x86_64 libcurl-7.29.0-57.el7.x86_64 libgcc-4.8.5-39.el7.x86_64 libidn-1.28-4.el7.x86_64 libselinux-2.5-15.el7.x86_ 64 libssh2-1.8.0-3.el7.x86_64 libstdc++-4.8.5-39.el7.x86_64 libxml2-2.9.1-6.el7.4.x86_64 nspr-4.21.0-1.el7.x86_64 nss-3.44.0-7.el7_7.x86_64 nss-softokn-freebl-3.44.0-8.el7_ 7.x86_64 nss-util-3.44.0-4.el7_7.x86_64 openldap-2.4.44-21.el7_6.x86_64 openssl-libs-1.0.2k-19.el7.x86_64 pcre-8.32-17.el7.x86_64 xz-libs-5.2.2-1.el7.x86_64 zlib-1.2.7-18.el7.x86_64 Μπορείτε να δείτε κάτι σαν τις ακόλουθες λέξεις:
Ο πυρήνας δημιουργήθηκε από το 'php-fpm: pool www '. Το πρόγραμμα τερματίστηκε με το σήμα 11, Σφάλμα τμηματοποίησης. bt(backtrace): Παραθέτει τη στοίβα κλήσεων
(gdb) bt #0 tsrm_realpath_r ( path=path@entry=0x7ffdd9ebf100 "/alidata/www/itsvse_web/./source/language/mobile/lang_template.php", έναρξη=start@entry=1, len=66, ll=ll@entry=0x7ffdd9ebf0f4, t=t@entry=0x7ffdd9ebf0f8, use_realpath=use_realpath@entry=2, is_dir=is_dir@entry=0, link_is_dir=link_is_dir@entry=0x0) στο /root/sh-1.5.5/php-5.5.7/TSRM/tsrm_virtual_cwd.c:751 #1 0x000000000075209a σε virtual_file_ex (κατάσταση=state@entry=0x7ffdd9ec0140, path=path@entry=0xed3a4d8 "/alidata/www/itsvse_web/./source/language/mobile/lang_template.php", verify_path=verify_path@entry=0x0, use_realpath=use_realpath@entry=2) στο /root/sh-1.5.5/php-5.5.7/TSRM/tsrm_virtual_cwd.c:1292 #2 0x000000000075308c για: tsrm_realpath ( path=path@entry=0xed3a4d8 "/alidata/www/itsvse_web/./source/language/mobile/lang_template.php", real_path=real_path@entry=0x7ffdd9ec1250 "vse_web/./source/plugin/dsu_amupper/pper.class.p\300\023\354\331\375\177") στο /root/sh-1.5.5/php-5.5.7/TSRM/tsrm_virtual_cwd.c :1954
Ελέγξτε το νήμα εξόδου
Παρουσιάζοντας το .gdbinit (σενάριο εντολών gdb) που παρέχεται στον πηγαίο κώδικα της PHP
Κοιτάξτε τις τιμές zbacktrace και μεταβλητών
(gdb) zbacktrace [0xed9f8f0] lang() /alidata/www/itsvse_web/source/function/function_core.php:444 [0xed9e2e8] lang("πυρήνας", "title_board_message") /alidata/www/itsvse_web/source/function/function_message.php:43 [0xed9a988] dshowmessage("mobile_template_no_found", "", πίνακας(1)[0xec46a28], πίνακας(0)[0xec46bc0], 0) /alidata/www/itsvse_web/source/function/function_core.php:1426 [0xed9a6d8] showmessage("mobile_template_no_found", "", array(1)[0xec46a28]) /alidata/www/itsvse_web/source/function/function_core.php:618 [0xed97638] template("dsu_amupper:pper_foot") /alidata/www/itsvse_web/source/plugin/dsu_amupper/pper.class.php:82 [0x7ffdd9ec3e50] plugin_dsu_amupper->global_footer(πίνακας(0)[0xec40028]) [0xed97080] call_user_func(πίνακας(2)[0xed6b8b0], πίνακας(0)[0xec40028]) /alidata/www/itsvse_web/source/function/function_core.php:1177 [0xed954b8] hookscript("παγκόσμια", "παγκόσμια") /alidata/www/itsvse_web/source/function/function_core.php:1214 [0xed95218] hookscriptoutput("showmessage") /alidata/www/itsvse_web/data/template/8_8_touch_common_showmessage.tpl.php:1 [0xed949e8] ??? /alidata/www/itsvse_web/source/function/function_message.php:237 [0xed91088] dshowmessage("mobile_template_no_found", "", πίνακας(1)[0xec40c10], πίνακας(0)[0xec76d40], 0) /alidata/www/itsvse_web/source/function/function_core.php:1426 [0xed90dd8] showmessage("mobile_template_no_found", "", array(1)[0xec40c10]) /alidata/www/itsvse_web/source/function/function_core.php:618 [0xed8dd38] template("dsu_amupper:pper_foot") /alidata/www/itsvse_web/source/plugin/dsu_amupper/pper.class.php:82 [0x7ffdd9ec49a0] plugin_dsu_amupper->global_footer(πίνακας(0)[0xec39ab0]) [0xed8d780] call_user_func(πίνακας(2)[0xeb833e8], πίνακας(0)[0xec39ab0]) /alidata/www/itsvse_web/source/function/function_core.php:1177 [0xed8bbb8] hookscript("παγκόσμια", "παγκόσμια") /alidata/www/itsvse_web/source/function/function_core.php:1214 [0xed8b918] hookscriptoutput("showmessage") /alidata/www/itsvse_web/data/template/8_8_touch_common_showmessage.tpl.php:1 [0xed8b0e8] ??? /alidata/www/itsvse_web/source/function/function_message.php:237 [0xed651b0] dshowmessage("mobile_template_no_found", "", πίνακας(1)[0xecc0fe0], πίνακας(0)[0xec76718], 0) /alidata/www/itsvse_web/source/function/function_core.php:1426 [0xed64f00] showmessage("mobile_template_no_found", "", array(1)[0xecc0fe0]) /alidata/www/itsvse_web/source/function/function_core.php:618 [0xed61e60] template("dsu_amupper:pper_foot") /alidata/www/itsvse_web/source/plugin/dsu_amupper/pper.class.php:82 [0x7ffdd9ec54f0] plugin_dsu_amupper->global_footer(πίνακας(0)[0xeb834f8])
(gdb) εκτύπωση ((zval *)0xec46a28) $1 = (zval *) 0xec46a28 (gdb) printzv $1 [0xec46a28] (refcount=5) πίνακας(1): { "url\0" => [0xecb2fb0] (refcount=2) συμβολοσειρά(33): "/admin.php?action=index&mobile=no" } (gdb) Λύση
Στην πραγματικότητα δεν είδα κανένα σφάλμα, αλλά ήταν προφανές από τα αρχεία καταγραφής ότι υπήρχε πρόβλημα με την πρόσβαση στο κινητό και μετά τη δοκιμή, ήταν πράγματι σφάλμα 502 μόνο στην περίπτωση πρόσβασης μέσω κινητού.
Επειδή δεν υπάρχει έκδοση για κινητά στο παρασκήνιο, τροποποίησα απευθείας τον πηγαίο κώδικα admin.php και πρόσθεσα τον ακόλουθο κώδικα στην πρώτη γραμμή:
Με αυτόν τον τρόπο, το πρόγραμμα θα λαμβάνει πάντα ένα αίτημα πρόσβασης από το πρόγραμμα περιήγησης του υπολογιστή και δεν θα περνάει από τον λογικό κώδικα της έκδοσης του κινητού τηλεφώνου, λυμένο!
|