如何调试突然退出的Perl程序?

taw*_*taw 3 debugging perl

我有基于Perl的程序IO::Async,它有时会在几小时/几天后退出,而不会打印任何错误消息.有没有什么dmesg/var/log两种.STDOUT/ STDERR都是autoflush(1)这样,数据不应该在缓冲区中丢失.它实际上并没有退出IO::Async::Loop->loop_forever- 打印我放在那里只是为了确保永远不会被触发.

现在一种方法是继续使用越来越多的打印方式来编写程序,并希望其中一个给我一些线索.是否有更好的方法来获取信息,使程序退出/静默崩溃?

Jim*_*nis 6

我使用过的一个技巧是运行程序straceltrace(或附加到进程使用strace).当然,这是在Linux下.在其他操作系统下,您可以使用ktrace或使用dtrace任何适当的操作系统.

我用过的程序只能在几天或一周内出现稀疏问题,然后只有数百个系统中的少数几个系统将我的跟踪器的输出定向到一个FIFO,并且自定义程序只保留一个环中的10K行缓冲区(并使用SIGPIPE和SIGHUP上的处理程序将当前缓冲区内容转储到文件中.(这是一个简单的程序,但我没有方便的副本,今晚我不会重写它;我的副本是为内部使用而写的,由前雇主拥有).

环形缓冲区允许程序无限期运行,因为担心磁盘空间不能运行系统......我们通常只需要几百甚至几千行的跟踪.