Вы можете прикрепить отладчик к многопоточному процессу 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». Chris has some examples в своем блоге.
Удачи.
(Shoutout для Dan's blog для некоторой ключевой информации для меня, в частности, потоковая исправить!)
Сайт 404. Пожалуйста, включите сюда шаги. – luckydonald 2018-02-09 08:09:38