Как отлаживать Perl-скрипты, которые разветвляются - PullRequest
9 голосов
/ 18 ноября 2010

Я использую perldb в emacs для отладки сценариев Perl (в Linux). Прекрасно работает, пока я не отлаживаю скрипт, который разветвляется. Если мой скрипт выполняет «форк», я получаю это:

######### Forked, but do not know how to create a new TTY. #########
  Since two debuggers fight for the same TTY, input is severely entangled.

  I know how to switch the output to a different window in xterms
  and OS/2 consoles only.  For a manual switch, put the name of the created TTY
  in $DB::fork_TTY, or define a function DB::get_fork_TTY() returning this.

  On UNIX-like systems one can get the name of a TTY for the given window
  by typing tty, and disconnect the shell from TTY by sleep 1000000.

Мне бы очень хотелось иметь возможность выбрать один процесс (родительский или дочерний) и продолжить отладку этого процесса, в то же время позволяя другому продолжать беспрепятственно. Растягивающаяся цель - это способ однозначно продолжить отладку ОБА процессов, возможно, открыв дополнительные кадры в emacs для окон управления и кода. Но возможность чистого продолжения отладки одного из них была бы большой победой.

Есть ли способ сделать это в perldb? Я пытался следовать предложению в этом сообщении, но ничего не получил с ним.

Или мне нужен какой-нибудь другой инструмент отладки Perl? Если последнее, какой отладчик Perl обеспечивает лучшую поддержку многопроцессной отладки?

Ответы [ 4 ]

6 голосов
/ 18 ноября 2010

Если у вас есть доступ к консоли и рабочему столу с графическим интерфейсом, запустите отладчик в окне xterm.Отладчик perl довольно легко работает с xterms, о чем говорит предупреждение.По мере создания новых процессов отладчик открывает новые окна xterm, и вы можете выполнять выполнение в любом процессе в любом порядке.

В любом случае очистка флага inhibit_exit также полезна для отладки.многопроцессные программы.Запустите

o inhibit_exit=0

из приглашения отладчика.Таким образом, когда вы создаете новый процесс, выполняющий Perl, и нет причин прерывать его в какой-либо точке внутри дочернего процесса, дочерний процесс не прерывает отладчик сообщением Debugged program terminated. Use q to quit or R to restart ....

5 голосов
/ 09 июля 2013

Поскольку вполне вероятно, что вы работаете под xterm или чем-то подобным, вас может укусить довольно узкое представление отладчика Perl о том, что такое "xterm".

Этоспециально искал строку "xterm".Он хочет видеть xterm в переменной окружения TERM.Не gnome-terminal.Не xterm-256color.Просто xterm.

Запустите с:

TERM=xterm perl -d ...

, чтобы убедиться, что он получает изображение.Я только понял, что один из десяти минут ворчания в отладчике Perl.

Кажется, он очень рад порождать тонны окон xterm и, кажется, не очень хорош в их очистке, когда он выходит, кстати.

4 голосов
/ 13 января 2011

Запуск отладчика в окне xterm, вероятно, является самым простым решением этой проблемы, но эта статья описывает альтернативный подход: существует недокументированная переменная $DB::fork_TTY, которая может назначать определенный TTY для разветвленных процессов.

Конечно, вы, вероятно, не хотите жестко кодировать такую ​​логику в своем коде, поэтому вы можете создать модуль отладчика, который вы будете использовать только тогда, когда вам нужно, с помощью флага -M в вашем Perl.команда.

1 голос
/ 18 ноября 2010

В этой ситуации настройка файлов журналов (с PID процесса в каждой строке) вполне может быть подходящим вариантом.Хотя это и не так удобно, как отладчик, возможно, это будет простой способ понять, что происходит с вашим кодом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...