【问题标题】:Trace subprocesses and threads in Python在 Python 中跟踪子进程和线程
【发布时间】:2020-03-06 14:41:15
【问题描述】:

我有一个在 Linux (Ubuntu 18.04) 中运行的 Python 脚本,它使用 multiprocessing 库创建进程,并为它们分配要执行的函数。问题是这些功能之一卡住了,我想知道它发生在哪里。我尝试使用python -m trace -l myscript.py,但它无法显示子进程中执行的函数。虽然下面的脚本不是我用的,但是在尝试追踪它的功能时也会出现这种情况。

import multiprocessing

def print_hello():
    print('hello world')

def print_hello_inside_trace():
    print('trace: hello world')

def trace_function():
    print_hello_inside_trace()

if __name__ == '__main__':
    print_hello()
    process = multiprocessing.Process(target=trace_function)
    process.start()
    process.join()

所以,我的问题是:有没有办法跟踪 Python 子进程中执行的代码?另外,出于好奇,是否可以跟踪 Python 线程?

【问题讨论】:

  • 我没有子进程的经验,但是你可以在一个不错的调试器中调试线程。检查例如Visual Studio 代码。
  • windows 还是 linux ?
  • 尝试将@snoop(depth=10) 添加到trace_function - 请参阅github.com/alexmojaki/snoop

标签: python multithreading trace multiprocess


【解决方案1】:

我会放更多的日志记录。 gdb 是你的朋友。您必须安装 python 调试扩展,例如py-bt 为您提供 python 代码堆栈跟踪。常规 bt 将为您提供 c 堆栈跟踪。很好的详细解释在这里DebuggingWithGdb

在 gdb 下运行它,或者如果它已经运行,则使用 pid 将 gdb 附加到它并使用 info 线程检查线程状态。

(gdb) info threads
  Id   Target Id         Frame
  37   Thread 0xa29feb40 (LWP 17914) "NotificationThr" 0xb7fdd424 in __kernel_vsyscall ()
  36   Thread 0xa03fcb40 (LWP 17913) "python2.7" 0xb7fdd424 in __kernel_vsyscall ()
  35   Thread 0xa0bfdb40 (LWP 17911) "QProcessManager" 0xb7fdd424 

它将告诉您每个线程处于当前状态的确切位置。一旦您发布更多详细信息,我们可以提供帮助。

【讨论】:

    【解决方案2】:

    是的,有一种方法可以跟踪 subprocessmultiprocessingthreading 模块。

    使用viztracer

    pip install viztracer
    viztracer --log_multiprocess your_script.py
    

    它会生成一个 result.html 文件,在浏览器中打开它。你会有这样的东西:

    如您所见,由于 viztracer 跟踪“一切”,您将获得比您需要的多一点。您需要找到感兴趣的函数,然后可以放大以查看发生了什么。

    在那里你可以看到你的功能之间的关系。他们何时以及如何打电话给对方。如果你选择了这个函数,你还可以在右下角看到它的源代码(也许你可以从第一张图看出)。

    viztracer 原生支持 multiprocessing--log_multiprocesssubprocess--log_subprocessthreading 模块。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-24
      • 2013-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-23
      相关资源
      最近更新 更多