Получение контроля над `pdb` из App Engine в Emacs

У меня есть приложение Python Google App Engine, которое я хочу отладить на сервере разработки в Emacs. У меня есть исполняемый файл pdb, который я создал, чтобы отладка хорошо работала с Emacs:

$ which pdb
/usr/bin/pdb
$ cat /usr/bin/pdb
#/bin/sh
exec python -m pdb "$@"

В Emacs я M-x pdb получаю запрос Run pdb (like this):, на который я ввожу pdb /usr/local/bin/dev_appserver.py /Users/[person]/path/to/app/directory.

Это начинается красиво. Я получаю окно с подсказкой (Pdb), я могу успешно устанавливать точки останова в ранних частях кода, например, в некоторых файлах dev_appserver.py, и использовать такие команды, как n, для пошагового выполнения строки за раз. Затем я могу ввести c, чтобы продолжить выполнение программы.

Проблема в том, что как только механизм приложения распечатывает свои обычные сообщения о запуске INFO (в тот же буфер, в котором происходит сеанс Pdb), я больше не получаю приглашение (Pdb), поэтому я не могу больше вводить pdb команды. Это и мой первый раз, когда я использую pdb, и моя первая отладка в Emacs, так что, возможно, я просто делаю что-то явно неправильно.


person Bryce Thomas    schedule 05.12.2013    source источник
comment
Я предлагаю сначала попытаться заставить pdb и механизм приложения работать вместе за пределами emacs (stackoverflow.com/questions/4497672/) ... Затем попробуйте добавить еще один уровень сложности.   -  person mgilson    schedule 05.12.2013
comment
Это не то, как вы используете pdb в appengine. Ознакомьтесь с документацией developers.google.com/appengine/docs/python/tools. / ввод pdb подключается к стандартному вводу/выводу управляющего процесса сервера разработки приложений. Возможно, вам также придется ограничить потоки. Как только вы это заработаете, вы можете посмотреть, как вы можете запустить dev_server из emacs. Не знаю, как вы можете это сделать, но сначала запустите базовый pdb, работающий внутри сервера разработки.   -  person Tim Hoffman    schedule 05.12.2013
comment
@TimHoffman, можете ли вы объяснить разницу в том, как работает PDB, если вы вставляете вызовы в исходный код по сравнению с вызовом dev_appserver.py с -m pdb из терминала? Насколько я понимаю, если вы вызываете его из терминала, он просто прерывается на первой строке кода (в данном случае на dev_appserver.py)? Это может быть не вариант, но я бы определенно предпочел не изменять исходный код только потому, что я хочу его отладить.   -  person Bryce Thomas    schedule 05.12.2013
comment
@mgilson Хороший вопрос. После stackoverflow.com/a/4498552/129475 (python pdb с терминала, а не с Emacs) я все еще испытываю то же самое проблема однако.   -  person Bryce Thomas    schedule 05.12.2013
comment
appengine выполняет фактический запрос к серверу в подпроцессе, подключенном через каналы; Таким образом, вы не можете напрямую устанавливать точки останова. Вы можете, если используете что-то вроде конструктора winpdb или boa, который поддерживает удаленную отладку. Вызывая pdb в коде, и у вас есть доступ к консоли, тогда stdin/stdout доступны в оболочке.   -  person Tim Hoffman    schedule 05.12.2013


Ответы (1)


У @TimHoffman есть хороший ответ. Сервер разработки перенаправляет pdb из различных реальных серверных процессов, поэтому вы не сможете запустить pdb из командной строки.

Альтернативой, которая может работать, является запуск сервера разработки из вашей командной строки emacs без pdb и вставка точки останова pdb в ваш код.

import pdb
pdb.set_trace()

Обычно я отлаживаю это, но не через emacs.

person dragonx    schedule 05.12.2013
comment
да, сейчас я в основном использую pdb в коде и отлаживаю из того же окна терминала, из которого я вызывал dev_appserver. Мне это не нравится, но я не нашел хорошего обходного пути. - person Bryce Thomas; 06.12.2013