确定进程是否正在运行或陷入无限循环,并找到进程卡在哪里

时间:2019-07-16 20:15:27

标签: python debugging infinite-loop

我正在使用python并对15,000个文件运行复杂的操作,总共约1 GB。我已经在测试集上测试了我的代码,它可以按预期工作。

在实际数据集上运行时,需要花费很长时间。但是,我想知道是否有一种方法可以检测程序是否正在运行或是否陷入无限循环。如果是,是否有办法找到卡住的位置?

我在这些链接上有一些细节:

  1. How do I detect where the program is stuck in an infinite loop?

  2. Use gdb to find where program stuck

但是它们特定于c和c ++。

我知道一种方法可能是在循环中添加打印命令以了解状态。但是,我已经启动了该程序,不想停止,修改和重新启动。

2 个答案:

答案 0 :(得分:0)

我不知道python中有什么方法可以中断已启动的进程,并获得有关其位置的追溯。可以想象可以附加一个调试器,例如gdb并在那里获得回溯,但是您看到的将是非常底层的代码,而不是源代码。

有几种方法可以在开始执行代码之前 设置python调试,然后将调试器连接到它。请参见Attaching a process with pdb,特别是https://stackoverflow.com/a/41574422/1404311-但同样,在代码运行之前,这需要付出一些努力。

当然,您还可以添加日志消息,但是再次提醒您,现在运行已经太晚了。

您还可以执行其他操作来了解正在发生的事情。关键问题是,您的代码做什么?它是计算密集型的吗?它正在执行大量文件I / O吗?

  • 查看CPU利用率。如果这是* ux,请运行tophtop,然后查看cpus的繁忙程度。查看可用的内存量;它正在改变吗?在Windows中,查看任务管理器。
  • 获取有关I / O操作的提示。有输出吗?继续ls进入输出目录,并查看文件大小或数量是否有所增加(或者只是继续更新Windows中的资源管理器窗口)。在* ux中,您可以使用lsof和类似的实用程序来查找打开了哪些文件。

如果您看到CPU的运动,I / O或正在使用的内存量的变化,则表明您的进程显然没有挂起。

如果您什么都看不到,那您还是不知道。

答案 1 :(得分:0)

首先,请访问这个可爱的debug博客以获取帮助。但是,正如您的研究和上面的评论所表明的那样,一旦程序开始执行,您将几乎无法获得所需的信息。


通常,只需检查程序的执行配置文件,就可以判断程序是卡住还是旋转。如果您使用的是UNIX系列计算机,则可以使用topps来查看它消耗了多少CPU时间和内存。您还可以检查已知的输出文件。简而言之,您想监视程序影响的已知系统资源。但是,这些只会间接告诉您程序在何处运行。


在执行开始时,您已经放弃了将检测插入程序的功能,该功能使您可以跟踪执行,设置断点或查询数据值。如果您擅长于编译,汇编和机器代码,则可以尝试编写根级程序以转储执行空间的映射并反汇编以查找代码和数据所在的位置。再次从根级别开始,偶尔会挂起程序以查看当前执行的位置,并检查数据值以弄清它在做什么。

所以...这在技术上是可能的,特别是如果您可以访问基本控件并单步执行程序。但是,将调试器拍打到您的代码上并重新开始运行的时间可能很多