Трассировка подпроцессов и потоков в Python - PullRequest
0 голосов
/ 06 марта 2020

У меня есть сценарий Python, работающий в Linux (Ubuntu 18.04), который создает процессы с использованием библиотеки 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 потоков?

1 Ответ

1 голос
/ 06 марта 2020

Я бы поставил больше логов. GDB твой друг. Вы должны установить python отладочные расширения, например py-bt, чтобы получить python трассировку стека кода. Обычный bt даст вам трассировку c стека. Очень хорошее подробное объяснение здесь DebuggingWithGdb

Запустите его под GDB или, если он уже запущен, подключите к нему GDB с помощью pid и проверьте состояние потоков с помощью информационных потоков.

(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 

Он скажет вам, где именно каждый поток находится в текущем состоянии. Как только вы опубликуете некоторые подробности, мы можем помочь.

...