2015-05-22 1 views
0

Я на Linux с скрипт рубина работает в окне терминала (он находится в цикле в то время как с некоторым промежутком времени сна, и делает работу, когда что-то меняется.)Приложить и отладить уже запущенный скрипт Ruby в Linux?

Проблема заключается в том, иногда сценарий, кажется, замораживать и перестать отвечать. Типичным сценарием является то, что я оставлю его сидящим всю ночь.

Если я сломал и перезапустил его, скрипт работает нормально.

Итак, 1) есть ли способ приложить к этому уже работающему интерпретатору скрипта ruby, чтобы узнать, где он застревает? В идеале я бы получил трассировку стека.

Если это невозможно на лету, 2) Как я могу запустить его, чтобы в следующий раз, когда он зависает, я могу получить стек?

ответ

0

Я думаю, что для решения этой проблемы есть, вероятно, лучшие «рубиновые пути». Но при поиске google на attach to a running ruby process появилось сообщение в блоге с некоторыми полезными советами по использованию gdb для отладки Live Ruby-процесса в Linux: Tools for Debugging Running Ruby Processes. Это еще связанно с another blog post с некоторой полезной информацией об использовании GDB для получения стека рубинового следа:

  1. Найти на PID вашего рубинового сценария, например,

    ps aux | grep -i <script_name.rb> 
    
  2. Присоединить к нему с помощью GDB:

    sudo gdb `which ruby` <pid> 
    
  3. Выполнить эти команды в GDB, чтобы получить Рубиновый трассировку:

    (gdb) set $ary = (int)backtrace(-1) 
    (gdb) set $count = *($ary+8) 
    (gdb) set $index = 0 
    (gdb) while $index < $count 
    > x/1s *((int)rb_ary_entry($ary, $index)+12) 
    > set $index = $index + 1 
    >end 
    

Это заставило меня близко, но GDB обнаружил ошибку при загрузке символов ruby ​​и еще одну ошибку, пытающуюся запустить функцию backtrace. Я уточню этот ответ, когда узнаю больше. Не стесняйтесь делать другие предложения.

  • Блогпост также связывает интересный набор gdb recipes для отладки Ruby.
Смежные вопросы