Существует ли способ присоединить отладчик к многопоточному процессу Python?

Посмотрите на этот пример Plnkr

Переменная this сильно отличается timesCalled с каждым нажатием кнопки увеличивается только на 1. Ответ на мой личный вопрос:

.click( () => { } )

и

.click(function() { })

создают одинаковое количество функции при использовании в цикле, как вы можете видеть из подсчета Guid в Plnkr.

28
задан Peter Mortensen 13 December 2009 в 17:37
поделиться

7 ответов

Да, gdb хорош для более низкой отладки уровня.

можно изменить потоки с поток команда.

, например,

(gdb) thr 2
[Switching to thread 2 (process 6159 thread 0x3f1b)]
(gdb) backtrace
....

Вы могли также проверить Python определенные отладчики как Winpdb, или pydb. Оба независимые от платформы.

11
ответ дан asksol 28 November 2019 в 03:30
поделиться

Используйте Winpdb. Это независимо от платформы графический отладчик Python GPL с поддержкой удаленной отладки по сети, несколько потоков, модификация пространства имен, встроили отладку, зашифрованную коммуникацию и до 20 раз быстрее, чем pdb.

Функции:

  • лицензия GPL. Winpdb является Бесплатное программное обеспечение.
  • Совместимый с CPython 2.3 до 2,6 и Python 3000
  • , Совместимый с wxPython 2.6 до 2,8
  • Независимый от платформы, и протестированный на Ubuntu Бесстрашный и Windows XP.
  • Пользовательские интерфейсы: rpdb2 является базирующейся консолью, в то время как winpdb требует wxPython 2.6 или позже.

Screenshot
(источник: winpdb.org )

15
ответ дан Glorfindel 28 November 2019 в 03:30
поделиться

Можно присоединить отладчик к многопоточному процессу 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 не завершатся на потоках кроме основного потока. С этим материалом на месте, можно сделать материал как [1 110]

gdb> attach <PID>
gdb> info threads
gdb> thread <N>
gdb> bt
gdb> pystack
gdb> detach

и видеть то, что продолжается. Отчасти.

можно проанализировать то, что объекты с "pyo" макросом. у Chris есть некоторые примеры на его блоге.

Удача.

(Публичное выражение благодарности для блог даН для некоторой ключевой информации для меня, особенно поточная обработка фиксирует!)

8
ответ дан Peter Mortensen 28 November 2019 в 03:30
поделиться

Если Вы имеете в виду pydb, нет никакого способа сделать это. В том направлении было некоторое усилие: видят фиксацию svn , но от нее отказались. Предположительно winpdb поддерживает его .

4
ответ дан Bartosz Radaczyński 28 November 2019 в 03:30
поделиться

Мой опыт, отлаживая многопоточные программы в PyDev (Eclipse на Windows XP), созданный поток start_new_thread использования потоков не мог быть сцеплен, но поток, созданный с помощью поточной обработки. Поток мог быть сцеплен. Надеюсь, что информация полезна.

4
ответ дан 28 November 2019 в 03:30
поделиться

На какой платформе Вы делаете попытку этого? Большинство отладчиков позволяет Вам присоединять к рабочему процессу при помощи идентификатора процесса. Можно или произвести идентификатор процесса через вход или использование чего-то как Диспетчер задач. Как только это достигается, будет возможно осмотреть отдельные потоки и их стеки вызовов.

РЕДАКТИРОВАНИЕ: у Меня нет опыта с Отладчиком GNU (GDB), который является кросс-платформенным, однако я нашел этот ссылка , и это может запустить Вас на правильном пути. Это объясняет, как добавить отладочные символы (удобный для чтения отслеживаний стека) и как дать gdb команду присоединять к рабочему процессу Python.

0
ответ дан Henk 28 November 2019 в 03:30
поделиться

Это может использоваться в качестве очень простого "удаленного" отладчика:

import sys
import socket
import pdb

def remote_trace():
    server = socket.socket()
    server.bind(('0.0.0.0', 12345))
    server.listen()
    client, _= server.accept()
    stream = client.makefile('rw')
    sys.stdin = sys.stdout = sys.stderr = stream
    pdb.set_trace()

remote_trace()

# Execute in the shell: `telnet 127.0.0.1 12345`

В Windows легче использовать Netcat вместо Telnet (который будет также работать над Linux).

0
ответ дан 28 November 2019 в 03:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: