Perlスクリプト呼び出し時のセグフォルトトレース(mytopツールと同様のツール)

Perlスクリプト呼び出し時のセグフォルトトレース(mytopツールと同様のツール)

私のGentooマシンで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にダウングレード(Portageで安定していると報告されている)、同じ結果:分割エラー
  • innotop 1.12.0(同様のツール)をインストールしましたが、同じ結果:分割エラー

2つの異なるツールを使用しても同じ問題が発生するため、注釈で特定のツールが提案されており、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をデバッグしたときにほぼ正確な出力を得たので、Gentooフォーラムの友達のアドバイスに従ってPerl、mysql、opensslを最初から再構築しました(すべての方法でsegfaultに関連しているようです)。役に立ちません。

私はgdbの出力を介したデバッグがトリックを実行できると思いますが、実際に進む方法がわかりません(以前に処理したことはありません)。

ベストアンサー1

ダウンロードしたらmytopのソースコード、tarballを解凍し、コンパイル可能性とPerl警告をテストします。

perl -cw mytop

私は得る:

mytop line 994のvoidコンテキストでプライベート変数を無駄に使用しました。
「my」変数$ dataは、mytop行1028と同じ範囲で前の宣言をマスクします。
mytop構文は正常です

ソースコードを調べると、これらの警告が確認されました。 994行目には以下があります。

セグメントブラウジング_994

太い矢印演算子 ('=>') は数値同等性比較演算子 ('==') でなければなりません。

同じ範囲に2つの$ data宣言があります。

セグメント閲覧_1020枚
...
セグメント閲覧_1028

したがって、ソースコードはレーンのPerl 5コードです。

私はGentooを持っていませんが、行番号を見るとGentooパッケージがこれらの問題を解決できなかったようです。 (私はUbuntuを持っています。Debian / Ubuntuのバージョンです。)私の相これらの警告は発生せず、ソースコードとは大きく異なります。 )

警告にもかかわらず、ソースコードはまだコンパイルされます。したがって、ソースバージョンで発生した警告は、現在表示されているセグフォルトを記述できない可能性があります。しかし、この質問は管理者に尋ねる必要があるようです。私の相Gentoo用。

おすすめ記事