如何调试fork的perl脚本

时间:2010-11-18 04:20:08

标签: perl debugging

我在emacs中使用perldb来调试Perl脚本(在Linux上)。工作得很好,直到我调试一个分叉的脚本。如果我的脚本执行“fork”,我会得到:

######### 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.

我真的希望能够选择一个进程(父进程或子进程)并继续调试该进程,同时允许另一进程继续畅通无阻。伸展目标是一种明确地继续调试BOTH进程的方法,可能在emacs中为控件和代码窗口打开额外的帧。但是能够干净地继续调试其中一个将是一个巨大的胜利。

有没有办法在perldb中执行此操作?我试图按照这条消息中的建议,但无处可去。

或者我还需要其他一些Perl调试工具吗?如果是后者,哪个Perl调试器为多进程调试提供了最好的支持?

4 个答案:

答案 0 :(得分:6)

如果您可以访问控制台和GUI桌面,请在xterm窗口中运行调试器。 perl调试器与xterms非常无缝地工作,正如警告消息所暗示的那样。在创建新进程时,调试器将打开新的xterm窗口,您可以按任何顺序逐步执行任何进程。

在任何一种情况下,清除inhibit_exit标志对于调试多进程程序也很有帮助。运行

o inhibit_exit=0
从调试器提示符

。这样,当您生成一个运行Perl的新进程,并且没有理由在子进程内的任何位置中断时,子进程不会使用Debugged program terminated. Use q to quit or R to restart ...消息中断调试器。

答案 1 :(得分:4)

由于你很可能 在xterm或类似的情况下运行,你可能会被Perl调试器对“xterm”的相当狭隘的观点所困扰。

它专门寻找字符串“xterm”。它希望在xterm环境变量中看到TERM。不是gnome-terminal。不是xterm-256color。只需xterm

使用以下命令运行:

TERM=xterm perl -d ...

确保获得图片。我只想在Perl调试器的十分钟之后发现一个。

似乎很高兴产生大量的xterm窗口,顺便说一下,当它退出时似乎不太好清理它们。

答案 2 :(得分:3)

在xterm窗口中运行调试器可能是解决此问题的最简单方法,但this article描述了另一种方法:有一个未记录的变量$DB::fork_TTY可以为分叉进程分配特定的TTY。

当然,您可能不希望在代码中对这种逻辑进行硬编码,因此您可以创建一个调试器模块,只有在需要时才能通过perl命令中的-M标志使用。

答案 3 :(得分:1)

在这种情况下,设置日志文件(每行中具有进程的PID)可能是最佳选择。虽然不如调试器那么方便,但它可能是一种简单的方法来了解您的代码发生了什么。