0

我有一个在 Linux(Ubuntu 18.04)中运行的 Python 脚本,它使用多处理库创建进程,为它们分配要执行的函数。问题是这些功能之一卡住了,我想知道它发生在哪里。我尝试使用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 线程?

4

2 回答 2

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 

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

于 2020-03-06T15:31:18.987 回答
1

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

使用viztracer

pip install viztracer
viztracer --log_multiprocess your_script.py

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

viztracer 的报告

如您所见,由于 viztracer 跟踪“一切”,您将获得比您需要的多一点。您需要找到感兴趣的功能,然后可以放大以查看正在发生的事情。

在此处输入图像描述

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

viztracer 原生支持multiprocessingwith --log_multiprocesssubprocesswith--log_subprocessthreadingmodule 。

于 2020-11-13T22:25:48.813 回答