2015-08-23 11 views
1

В недавнем проекте я хочу отладить мою программу в состоянии использования. Производственная среда очень сложная, поэтому я хочу отлаживать программу всякий раз, когда я нахожу проблему.введите pdb с сигналом kill

Это то, чего я хочу достичь: всякий раз, когда я хочу отлаживать, я отправлю сигнал об ошибке в программу и, надеюсь, появится отладчик pdb. Это что-то вроде этого:

import pdb 
import signal 
import time 

def handler(signal, frame): 
    pdb.set_trace() 

signal.signal(signal.SIGTERM, handler) 
a=1 
while True: 
    a+=1 
    time.sleep(1) 

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

Есть ли что-нибудь подобное для этого?

ответ

2

Если запустить программу из терминала, вы можете использовать команду tty отметить терминальное устройство вы на, и передать его в программу в среде:

TTY=`tty` nohup ./myprog.py 

, а затем в обработчике открыть TTY снова и установить стандартный ввод и стандартный вывод в файл:

import sys,os 

def handler(signal, frame): 
    tty = os.getenv('TTY') 
    sys.stdin = sys.stdout = open(tty,"r+") 
    pdb.set_trace() 

Если вы отсоединение программы из текущего TTY, как в своем комментарии, то вы можете попробовать что-то подобное, с тем же кодом python. На этот раз запустите свою программу с помощью:

TTY=/tmp/link nohup ./myprog.py & 

и закройте терминал. Откройте новый терминал и создать отсутствующую ссылку на эту новую TTY:

ln -s `tty` /tmp/link 

Затем дают, в одной строке, то команда убить, чтобы сигнализировать процесс питона и затем сразу же сделать sleep. Это значит, что оболочка больше не конкурирует с pdb для ввода из tty. Например, в одной строке:

kill -term $pid; sleep 99999 

Затем у вас будет PDB подключиться к/TMP/ссылки, который является вашим терминалом. Когда вы выходите из pdb, введите ctrl-c остановит сон.

Если вам нужно использовать Ctrl-C в PDB, и вы используете Баш, заменить sleep 99999 на suspend. Когда вы выходите из pdb, используйте меню вашего терминала, чтобы отправить сигнал sigcont в процесс, чтобы вернуть приостановленный баш.

+0

Мне пришлось использовать 'nohup python myprog.py &' для запуска программы. Когда я убил процесс, он, похоже, не правильно ввел pdb: 'wangc @ lion: ~/workspace/temp> kill 2684 wangc @ lion: ~/workspace/temp> --Return-- >/home/wangc/workspace/temp/wwtest.py (10) обработчик() -> None -> pdb.set_trace() ' –

+0

У вас есть 2 процесса, сражающихся за терминал. Для этого примера нельзя использовать python с символом «&». Сделайте убийство с другого терминала. – meuh

+0

О, мне нужно закрыть оригинальный терминал, потому что я использую ssh из окон. Я не могу оставить программу ssh открытой навсегда. –

0

Совершенно другой подход, который является более простым и элегантным, на мой взгляд, заключается в использовании rpyc. Я давно использую этот подход в своей сложной системе, и это упростило в режиме реального времени отладку.

В принципе, вам нужно определить простую службу API rpyc, которая содержит «выставленные» методы для возврата ссылок («netrefs») к наиболее интересным объектам в вашей системе. Затем вы запускаете rpyc ThreadedServer в своем процессе во время запуска.

Затем, когда бы вы ни захотели, вы можете просто создать клиент rpyc и подключиться к процессу, получить ссылки на объекты через API и проверить их (прозрачно, как будто эти netrefs являются локальными объектами). Используя правильные методы API, вы можете в значительной степени получить доступ к что-нибудь, которое вы хотите в прямом эфире.

Другие преимущества этой оценки заключаются в том, что (1) этот интерактивный сеанс даже не должен влиять на текущий процесс (если, конечно, вы не вызываете методы, вызывающие побочные эффекты и т. Д.), (2) 't должен быть интерактивным, то есть вы можете легко написать сценарий, который подключается к процессу и печатает какую-либо информацию из него.

 Смежные вопросы

  • Нет связанных вопросов^_^