Perl 스크립트 호출 시 세그폴트 추적(mytop 도구 및 유사한 도구)

Perl 스크립트 호출 시 세그폴트 추적(mytop 도구 및 유사한 도구)

내 젠투 머신에서 mytop 1.9.1이 호출되면 다음 출력과 함께 종료됩니다:

# mytop
Useless use of private variable in void context at /usr/bin/mytop line 1001.
"my" variable $data masks earlier declaration in same scope at /usr/bin/mytop line 1035.
Errore di segmentazione

내가 아는 한 mytop은 Perl 스크립트(이 도구는 vi /usr/bin/mytop 명령을 통해 효과적으로 읽을 수 있음)이므로 위에서 언급한 대로 모든 Perl 하위 종속성을 업데이트해 보았습니다.https://wiki.gentoo.org/wiki/Perl), 그러나 문제는 해결되지 않았습니다.

그런 다음 다음도 시도했습니다.

  • mytop 1.6-r4로 다운그레이드(포티지에서 안정적이라고 보고됨), 동일한 결과: 분할 오류
  • innotop 1.12.0(비슷한 도구)을 설치했는데 동일한 결과: 분할 오류

두 개의 서로 다른 도구를 사용해도 동일한 문제가 발생하므로 주석에서 특정 도구가 제안되었으며 gdb를 통해 perl을 실행한 다음 mytop을 시작하여 bt를 사용하여 출력을 추적했는데 출력은 다음과 같습니다.

# gdb /usr/bin/perl
GNU gdb (Gentoo 8.1 p1) 8.1
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-pc-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://bugs.gentoo.org/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from /usr/bin/perl...(no debugging symbols found)...done.
(gdb) run /usr/bin/mytop
Starting program: /usr/bin/perl /usr/bin/mytop
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/libthread_db.so.1".
Useless use of private variable in void context at /usr/bin/mytop line 1001.
"my" variable $data masks earlier declaration in same scope at /usr/bin/mytop line 1035.

Program received signal SIGSEGV, Segmentation fault.
0xb731511c in EVP_CIPHER_CTX_init () from /usr/lib/libcrypto.so.1.0.0
(gdb) bt
#0  0xb731511c in EVP_CIPHER_CTX_init () from /usr/lib/libcrypto.so.1.0.0
#1  0xb75563f6 in my_aes_decrypt () from /usr/lib/libmysqlclient.so.18
#2  0xb75521eb in ?? () from /usr/lib/libmysqlclient.so.18
#3  0xb75527c4 in ?? () from /usr/lib/libmysqlclient.so.18
#4  0xb75529ec in my_search_option_files () from /usr/lib/libmysqlclient.so.18
#5  0xb7553406 in my_load_defaults () from /usr/lib/libmysqlclient.so.18
#6  0xb7512e14 in mysql_read_default_options () from /usr/lib/libmysqlclient.so.18
#7  0xb751a56d in mysql_real_connect () from /usr/lib/libmysqlclient.so.18
#8  0xb78a013c in mysql_dr_connect () from /usr/lib/perl5/vendor_perl/5.24.3/i686-linux/auto/DBD/mysql/mysql.so
#9  0xb78a25ea in ?? () from /usr/lib/perl5/vendor_perl/5.24.3/i686-linux/auto/DBD/mysql/mysql.so
#10 0xb78a26c7 in mysql_db_login () from /usr/lib/perl5/vendor_perl/5.24.3/i686-linux/auto/DBD/mysql/mysql.so
#11 0xb78ade8c in ?? () from /usr/lib/perl5/vendor_perl/5.24.3/i686-linux/auto/DBD/mysql/mysql.so
#12 0xb7e92b04 in Perl_pp_entersub () from /usr/lib/libperl.so.5.24
#13 0xb7e8b043 in Perl_runops_standard () from /usr/lib/libperl.so.5.24
#14 0xb7e12a02 in Perl_call_sv () from /usr/lib/libperl.so.5.24
#15 0xb78cfd13 in XS_DBI_dispatch () from /usr/lib/perl5/vendor_perl/5.24.3/i686-linux/auto/DBI/DBI.so
#16 0xb7e92b04 in Perl_pp_entersub () from /usr/lib/libperl.so.5.24
#17 0xb7e8b043 in Perl_runops_standard () from /usr/lib/libperl.so.5.24
#18 0xb7e1a6cb in perl_run () from /usr/lib/libperl.so.5.24
#19 0x00400a67 in main ()
(gdb) 

같은 방식으로 innotop을 디버깅할 때 거의 정확한 출력을 얻었으므로 젠투 포럼에 있는 친구의 조언에 따라 Perl, mysql 및 openssl을 처음부터 다시 빌드해 보았습니다(모두 어떤 방식으로든 segfault와 관련된 것 같았습니다). 도움이 안 돼요.

나는 gdb의 출력을 통한 디버깅이 트릭을 수행할 수 있다고 생각하지만 실제로 진행하는 방법을 모릅니다(이전에 처리한 적이 없습니다).

답변1

내가 다운로드하면mytop의 소스 코드, tarball의 압축을 풀고 컴파일 가능성과 Perl 경고를 테스트합니다...

perl -cw mytop

나는 얻다:

mytop 라인 994의 void 컨텍스트에서 개인 변수를 쓸모 없게 사용했습니다.
"my" 변수 $data는 mytop 라인 1028과 동일한 범위에서 이전 선언을 마스크합니다.
mytop 구문은 정상입니다

소스 코드를 검사하면 이러한 경고가 확인되었습니다. 994행에는 다음이 있습니다.

세그먼트 브라우징_994장

굵은 화살표 연산자('=>')는 수치 동등성 비교 연산자('==')여야 합니다.

동일한 범위에 두 개의 $data 선언이 있습니다.

세그먼트 브라우징_1020장
...
세그먼트 브라우징_1028장

따라서 소스 코드는 차선의 Perl 5 코드입니다.

저는 Gentoo를 갖고 있지 않지만 행 번호를 보면 Gentoo 패키지가 이러한 문제를 해결하지 못한 것 같습니다. (저는 Ubuntu를 가지고 있습니다. Debian/Ubuntu 버전입니다.내 상의이러한 경고는 발생하지 않으며 소스 코드와 크게 다릅니다. )

경고에도 불구하고 소스 코드는 여전히 컴파일됩니다. 따라서 소스 버전에서 발생한 경고는 현재 보고 있는 세그폴트를 설명하지 못할 수도 있습니다. 하지만 이 질문은 관리자에게 물어봐야 할 것 같습니다.내 상의젠투용.

관련 정보