Отслеживание SegFault при вызове скрипта Perl (инструмент Mytop и аналогичный)

Воспользуйтесь подсказкой Autotools: придерживайтесь наименьшего общего знаменателя оболочки Борна и POSIX - возможно, дополненного sed - если вы нужно написать что-то, что должно работать везде . Могут существовать системы, в которых что-то ломается, но вы можете обойти такие проблемы, переписав.

Например, в некоторых древних системах есть проблемы с ошибками раскрытия в test , также известном как [:

 if [ $foo = bar ] ; then...

, поэтому практика Autoconf состоит в том, чтобы переписать его в двойные кавычки с односимвольным префиксом, например:

 if [ x"$foo" = "xbar" ] ; then...

Вы также можете использовать здесь "x $ foo" . Это защищает от возможности того, что $ foo может быть допустимым вариантом для test (1) , и поскольку [ является псевдонимом для test ], это может неверно истолковать выражение. Решение состоит в том, чтобы создать ситуацию, когда неизвестный аргумент [ всегда начинается с x , что означает, что он не может иметь особого значения для [].

(Autoconf также рекомендует использовать test вместо [, но этот совет является реакцией на возможные конфликты с M4 , который также использует ] [ в его синтаксисе.)

awk - это POSIX , поэтому теоретически он доступен везде. Он есть даже в Busybox , поэтому у вас будет реализация awk даже в некоторых очень ограниченных встроенных системах Linux. Тем не менее, я был бы менее удивлен, встретив систему без awk , чем sed . Полагаю, дело в сложности: более простые инструменты с большей вероятностью переживут агрессивную сортировку.

Perl не является частью какого-либо широко распространенного стандарта, POSIX или другого, поэтому вы просто не можете рассчитывать на него, если ничего заранее не знаете о целевой среде. Perl не устанавливается по умолчанию в:

  • Cygwin
  • FreeBSD и NetBSD
  • «минимальные» установки для некоторых Linux, включая Slackware
  • , многие встроенные Linux-системы, которые в основном полагаются на Busybox для своей пользовательской среды

Autoconf В руководстве есть глава по программированию переносимой оболочки , которая должна быть вам полезна. В последнем разделе рассматриваются такие инструменты, как sed , awk и многие другие.

0
20.12.2018, 13:27
1 ответ

Если я загружу исходный код для mytop , распакую архив и проверю его на компилируемость и предупреждения Perl...

perl -cw mytop

Я понял:

Useless use of private variable in void context at mytop line 994.
"my" variable $data masks earlier declaration in same scope at mytop line 1028.
mytop syntax OK

Изучение исходного кода подтверждает эти предупреждения. В строке 994 имеем:

 994                 print GREEN() if ($Ratio_now => 80.0);

Оператор толстой стрелки ('=>' )должен быть оператором сравнения числового равенства ('==' ).

Есть два объявления $data в одной области видимости:

1020         my($data) = Hashes('show global variables like "read_only"');
...
1028     my($data) = Hashes('SHOW SLAVE STATUS');

Таким образом, исходный код является -оптимальным кодом Perl 5.

У меня нет Gentoo, но, учитывая номера строк, я подозреваю, что пакет Gentoo не смог исправить эти проблемы. (У меня Ubuntu; версия mytop для Debian/Ubuntu не выдает этих предупреждений и сильно отличается от исходного кода.)

Несмотря на предупреждения, исходный код компилируется. Следовательно, предупреждения, которые выдает исходная версия, могут не объяснять segfaults, которые вы видите. Но я думаю, вам нужно обсудить эту проблему с теми, кто поддерживает mytop для Gentoo.

0
28.01.2020, 04:07

Теги

Похожие вопросы