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

标签 perl debugging

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

现在,一种方法是继续在程序中添加越来越多的打印件,并希望其中一个能给我一些线索。有没有更好的方法来获取导致程序退出/静默崩溃的信息?

最佳答案

我使用的一个技巧是在 straceltrace 下运行程序(或使用 strace 附加到进程)。自然是在 Linux 下。在其他操作系统下,您将使用 ktracedtrace 或任何合适的。

我对仅在数天或数周内表现出稀疏问题的程序使用的一个技巧是,将跟踪器的输出定向到 FIFO,并让自定义程序仅保留 10K 行在环形缓冲区中(并在 SIGPIPE 和 SIGHUP 上使用处理程序将当前缓冲区内容转储到文件中。(这是一个简单的程序,但我手边没有副本,今晚我不打算重写它; 我的副本是为内部使用而编写的,归前雇主所有)。

环形缓冲区允许程序无限期地运行,而不必担心运行系统会耗尽磁盘空间……在这种情况下,我们通常只需要几百行甚至几千行的跟踪信息。

关于perl - 如何调试突然退出的 Perl 程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3003444/

相关文章:

javascript - 函数创建者的参数何时在创建的函数中可用?

.net - 如何使用特定文件启动 Excel 加载项调试器?

perl - 如何搜索大型数据结构并返回给出特定值的一系列键/数组?

perl - 推特 LED 时间轴

asp.net - 调试在带有 .net 5 MVC 6 的 Visual Studio 2015 RC 2 中不起作用

c# - .NET 远程调试作为来自另一个域的另一个用户?

perl - 如何限制在 Perl 脚本的特定部分花费的时间?

regex - 如何使用 Perl 的正则表达式用单个换行符替换多个换行符?

python - 为什么我在使用 Perl 执行 Python 脚本时没有收到任何语法错误?

debugging - 仅在 IE 上闪烁 CSS 动画