Вы можете присоединить отладчик к многопоточному процессу Python, но вам нужно сделать это на уровне C. Чтобы понять, что происходит, вам нужно, чтобы интерпретатор Python был скомпилирован с символами. Если у вас его нет, вам нужно скачать исходный код с python.org и собрать его самостоятельно:
./configure --prefix=/usr/local/pydbg
make OPT=-g
sudo make install
sudo ln -s /usr/local/pydbg/bin/python /usr/local/bin/dbgpy
Убедитесь, что ваша рабочая нагрузка работает на этой версии интерпретатора. Затем вы можете присоединиться к нему с помощью GDB в любое время. Ребята из Python включили пример «.gdbinit» в свой каталог Misc, в котором есть несколько полезных макросов. Однако он не работает для многопоточной отладки (!). Вам нужно заменить строки следующим образом
while $pc < Py_Main || $pc > Py_GetArgcArgv
со следующим:
while ($pc < Py_Main || $pc > Py_GetArgcArgv) && ($pc < t_bootstrap || $pc > thread_PyThread_start_new_thread)
В противном случае такие команды, как pystack
, не будут заканчиваться на других потоках, кроме основного С этим материалом вы можете делать такие вещи, как
gdb> attach <PID>
gdb> info threads
gdb> thread <N>
gdb> bt
gdb> pystack
gdb> detach
и посмотри, что происходит. Вид.
Вы можете разобрать, что это за объекты, с помощью макроса "pyo". У Криса есть несколько примеров в его блоге.
Удачи.
(Подпишитесь на блог Дэна , чтобы получить некоторую ключевую информацию для меня, в частности, исправление потоков!)