이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 7943|회답: 0

gdb를 사용해 php-fpm 예외 오류를 디버깅하세요

[링크 복사]
게시됨 2020. 5. 23. 오후 5:54:01 | | | |
GDB 소개:

GDB는 GNU 오픈 소스 조직에서 출시한 강력한 UNIX 프로그램 디버깅 도구입니다. 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

핵심 파일

코어 파일은 실제로 메모리 이미지로, 프로그램이 충돌할 때 해당 메모리 정보를 저장하며 주로 프로그램 디버깅에 사용됩니다. 프로그램이 충돌하면 코어 파일이 생성되며, 사실 코어 덤프 파일이라고 해야 합니다. 기본 생성 위치는 실행 프로그램과 같은 디렉터리에 있고, 파일 이름은 core.***이며, 여기서 ***는 특정 숫자입니다.

명령:

코어 파일 크기 (블록, -c) 0
데이터 세그먼트 크기 (KB, -D) 무제한
스케줄링 우선순위 (-e) 0
파일 크기 (블록, -f) 무제한
대기 신호 (-I) 7271
최대 잠금된 메모리 (kbytes, -l) 64
최대 메모리 크기 (kbytes, -m) 무제한
열린 파일 (-번호) 65535
파이프 크기 (512바이트, -p) 8
POSIX 메시지 큐(바이트, -q) 819200
실시간 우선순위 (-R) 0
스택 크기 (kbytes, -s) 8192
CPU 시간 (초, -t) 무제한
최대 사용자 프로세스 (-u) 7271
가상 메모리(KBo, -V) 무제한
파일 잠금(-x) 무제한

코어 파일 크기가 0이면 코어 파일을 생성할 수 없으며, 이를 설정해야 합니다.

ulimit -c unlimited는 코어 파일의 크기가 무제한임을 의미합니다


설정 완료, 기억하세요php-fpm 서비스를 재시작하세요, 명령어는 다음과 같습니다:



오류 로그를 다시 확인하라, 다음과 같다:

[2020년 5월 23일 14:39:14] 경고: [풀 www] 자식 2220이 신호 11에 따라 출발 7.255225초 만에 나갔습니다 (SIGSEGV - 코어 덤프됨)
[2020년 5월 23일 14:39:14] 공지: [풀 www] 아이 2231 시작

로그에 "SIGSEGV – 코어 덤프"라는 문구가 포함되어 있다면, 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

.gdbinit 파일 최신 PHP 다운로드 주소:

하이퍼링크 로그인이 보입니다.

핵심 파일을 열기 위해 GDB를 사용합니다

코어 파일 디렉터리에서 다음 명령을 실행하세요:

[root@o itsvse_web]# GDB PHP-FPM -c 코어.2220
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-119.el7
저작권 (C) 2013 자유 소프트웨어 재단 주식회사
라이선스 GPLv3+: GNU GPL 버전 3 또는 그 이후 <하이퍼링크 로그인이 보입니다.
이것은 자유 소프트웨어입니다: 자유롭게 변경하고 재배포할 수 있습니다.
법적으로 허용되는 범위 내에서 보증은 없습니다.  "show copying" 입력
그리고 자세한 내용은 "보증 표시"입니다.
이 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=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가 누락된 경우, 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(백트레이스): 콜 스택을 나열합니다

(gdb) BT
#0 tsrm_realpath_r (
    path=path@entry=0x7ffdd9ebf100 "/alidata/www/itsvse_web/./source/language/mobile/lang_template.php",
    start=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=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") at /root/sh-1.5.5/php-5.5.7/TSRM/tsrm_virtual_cwd.c :1954



퇴사 스레드를 검토해 보세요


PHP 소스 코드에 제공되는 .gdbinit(gdb 명령 스크립팅) 소개



zbacktrace와 변수 값을 살펴보세요

(gdb) zbacktrace
[0xed9f8f0] lang() /alidata/www/itsvse_web/source/function/function_core.php:444
[0xed9e2e8] lang("core", "title_board_message") /alidata/www/itsvse_web/source/function/function_message.php:43
[0xed9a988] dshowmessage("mobile_template_no_found", ", array(1)[0xec46a28], array(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] 템플릿("dsu_amupper:pper_foot") /alidata/www/itsvse_web/source/plugin/dsu_amupper/pper.class.php:82
[0x7ffdd9ec3e50] plugin_dsu_amupper->global_footer(array(0)[0xec40028])
[0xed97080] call_user_func(array(2)[0xed6b8b0], array(0)[0xec40028]) /alidata/www/itsvse_web/source/function/function_core.php:1177
[0xed954b8] hookscript("global", "global") /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", "", array(1)[0xec40c10], array(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] 템플릿("dsu_amupper:pper_foot") /alidata/www/itsvse_web/source/plugin/dsu_amupper/pper.class.php:82
[0x7ffdd9ec49a0] plugin_dsu_amupper->global_footer(array(0)[0xec39ab0])
[0xed8d780] call_user_func(array(2)[0xeb833e8], array(0)[0xec39ab0]) /alidata/www/itsvse_web/source/function/function_core.php:1177
[0xed8bbb8] hookscript("global", "global") /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", "", array(1)[0xecc0fe0], array(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] 템플릿("dsu_amupper:pper_foot") /alidata/www/itsvse_web/source/plugin/dsu_amupper/pper.class.php:82
[0x7ffdd9ec54f0] plugin_dsu_amupper->global_footer(array(0)[0xeb834f8])

(gdb) 인쇄 ((zval *)0xec46a28)
$1 = (zval *) 0xec46a28
(gdb) printzv $1
[0xec46a28] (refcount=5) array(1): {
    "URL\0" => [0xecb2fb0] (refcount=2) string(33): "/admin.php?action=index&mobile=no"
  }
(gdb)
용액

실제로 오류는 보이지 않았지만, 로그를 보면 모바일 접속에 문제가 있다는 것이 분명했고, 테스트 결과 모바일 접속에서만 502 오류가 발생했습니다.

모바일 버전이 백그라운드에 없기 때문에, admin.php 소스 코드를 직접 수정하고 첫 줄에 다음과 같은 코드를 추가했습니다:

이렇게 하면 프로그램이 항상 PC 브라우저에서 접근 요청을 받고, 모바일 버전의 논리 코드를 거치지 않게 됩니다. 해결됐습니다!




이전의:Nginx는 404 오류 페이지를 맞춤화하고 200 상태 코드 해답을 반환합니다
다음:Angular에서 [ngClass]와 [ngStyle]의 기본 사용
면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com