Αυτό το άρθρο είναι ένα άρθρο καθρέφτη της αυτόματης μετάφρασης, κάντε κλικ εδώ για να μεταβείτε στο αρχικό άρθρο.

Άποψη: 7943|Απάντηση: 0

Χρησιμοποιήστε το gdb για να διορθώσετε το σφάλμα εξαίρεσης php-fpm

[Αντιγραφή συνδέσμου]
Δημοσιεύτηκε στις 23/5/2020 5:54:01 μ.μ. | | | |
Εισαγωγή 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 και πρόσθεσα τον ακόλουθο κώδικα στην πρώτη γραμμή:

Με αυτόν τον τρόπο, το πρόγραμμα θα λαμβάνει πάντα ένα αίτημα πρόσβασης από το πρόγραμμα περιήγησης του υπολογιστή και δεν θα περνάει από τον λογικό κώδικα της έκδοσης του κινητού τηλεφώνου, λυμένο!




Προηγούμενος:Το Nginx προσαρμόζει τη σελίδα σφάλματος 404 και επιστρέφει μια λύση κωδικού κατάστασης 200
Επόμενος:Βασική χρήση των [ngClass] και [ngStyle] στο Angular
Αποκήρυξη:
Όλο το λογισμικό, το υλικό προγραμματισμού ή τα άρθρα που δημοσιεύονται από το Code Farmer Network προορίζονται μόνο για μαθησιακούς και ερευνητικούς σκοπούς. Το παραπάνω περιεχόμενο δεν θα χρησιμοποιηθεί για εμπορικούς ή παράνομους σκοπούς, άλλως οι χρήστες θα υποστούν όλες τις συνέπειες. Οι πληροφορίες σε αυτόν τον ιστότοπο προέρχονται από το Διαδίκτυο και οι διαφορές πνευματικών δικαιωμάτων δεν έχουν καμία σχέση με αυτόν τον ιστότοπο. Πρέπει να διαγράψετε εντελώς το παραπάνω περιεχόμενο από τον υπολογιστή σας εντός 24 ωρών από τη λήψη. Εάν σας αρέσει το πρόγραμμα, υποστηρίξτε γνήσιο λογισμικό, αγοράστε εγγραφή και λάβετε καλύτερες γνήσιες υπηρεσίες. Εάν υπάρχει οποιαδήποτε παραβίαση, επικοινωνήστε μαζί μας μέσω email.

Mail To:help@itsvse.com