如何调试分叉的Perl脚本

11
我在Emacs中使用perldb调试Perl脚本(在Linux上)。它的效果很好,但是当我调试一个分叉的脚本时就会出现问题。如果我的脚本执行了“fork”,我会得到这个错误信息:
######### Forked, but do not know how to create a new TTY. #########
由于两个调试器争夺同一个TTY,输入会被严重缠绕。
我知道如何将输出切换到xterms和OS/2控制台中的不同窗口。对于手动切换,请将创建的TTY名称放入$DB::fork_TTY中,或定义一个返回此内容的函数DB::get_fork_TTY()。
在类Unix系统上,可以通过键入tty获取给定窗口的TTY名称,并通过sleep 1000000断开shell与TTY的连接。
我真的希望能够选择一个进程(父进程或子进程)并继续调试该进程,同时允许另一个进程继续运行而不受影响。
一个目标是找到一种方法来明确地继续调试两个进程,可能需要在Emacs中打开额外的控制和代码窗口。但是,能够干净地继续调试其中一个进程将是一个巨大的收获。
在perldb中有没有这样的方法?我尝试按照这条消息中的建议进行操作,但没有进展。
还是我需要其他Perl调试工具?如果是后者,哪个Perl调试器提供最好的多进程调试支持?
4个回答

7
如果您可以访问控制台和GUI桌面,请在xterm窗口中运行调试器。正如警告信息所指的那样,Perl调试器与xterms的兼容性非常好。随着新进程的创建,调试器将打开新的xterm窗口,您可以按任意顺序逐步执行任何进程。
无论哪种情况,清除inhibit_exit标志也很有帮助,特别是对于调试多进程程序。请运行:
o inhibit_exit=0

从调试器提示符处执行此操作。这样,当您生成运行Perl的新进程,并且在子进程内部没有任何中断点的情况下,子进程将不会通过 Debugged program terminated. Use q to quit or R to restart ... 消息中断调试器。


6

由于很可能您正在运行 xterm 或类似终端,因此您可能正在受到 Perl 调试器对“xterm”的狭隘看法的影响。

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

使用以下命令运行:

TERM=xterm perl -d ...

为了确保它能够看到图片。在经过十分钟的抱怨Perl调试器后,我才弄清楚这一点。
顺便说一下,它似乎很高兴生成大量的xterm窗口,并且在退出时清理它们似乎不是很好。

我也遇到了这个错误,但是通过 @z=\program and args`;` 运行CLI程序。在调试过程中从未出现过这个消息。发生了什么?总命令字符串长度为274个字符。在Ubuntu 18.04下会有问题吗? - Bulrush
@Bulrush 绝对没有头绪。请发布一个新问题。 - Craig Ringer
对我来说不起作用。尝试启动mate终端,但由于某些原因从未将其连接到调试器。 - Andrew DeFaria

4
在xterm窗口中运行调试器可能是解决这个问题最简单的方法,但是这篇文章描述了另一种方法:有一个未记录的变量$DB::fork_TTY可以为分叉进程分配特定的TTY。
当然,你可能不想在你的代码中硬编码这种逻辑,所以你可以创建一个调试器模块,只在需要时通过-M标志在你的perl命令中使用。

1
在这种情况下,设置日志文件(每行带有进程的PID)可能是可行的方法。虽然不像调试器那样方便,但这可能是一种理解代码运行情况的简单方式。

如果你要走这条路,那么请查看 Devel::Trace::Fork - mob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接