2012-01-20 8 views
4

Я только что написал процесс скребка. Это отдельная файловая программа - загружает ActiveRecord, создает пару моделей, определяет пару функций скремблирования и затем запускается в цикле.Как я могу сбросить код (а не объекты/стек) работающего Ruby-процесса?

К сожалению, я испортил команду git, и теперь сам файл пропал.

Однако, у do есть один экземпляр скребка, который в настоящее время работает. Я отправил SIGSTOP для предотвращения возможных ошибок.

Как я могу подключиться к процессу и заставить его сбрасывать код, чтобы я мог скопировать его обратно в файл .rb?

Меня не интересует его трассировка стека или другие случайные объекты в ОЗУ; это совершенно неважно, поскольку оно написано как убийственное в любое время без потерь. Я просто не хочу переписывать эту проклятую вещь.

https://github.com/ileitch/hijack похоже, что это позволит мне приложить отладчик к запущенному процессу, что является хорошим первым шагом. Но предположим, что я это сделаю, и что?

FWIW, мне удалось восстановить ~ 60 строк, используя puts Readline::HISTORY.to_a.reverse.uniq.reverse с консоли irb, в которой я играл с кодом. Но я предпочел бы все остальное, если смогу.

Спасибо!

ETA: https://github.com/ngty/sourcify - другой возможный link здесь.

ETA2: ... phew, dropbox поймал его. Должно было подумать, чтобы это проверить раньше. > <

Итак, уже не критический, но все же любопытный, если это можно сделать.

+4

Там не много вы можете сделать в мерзавца, который не является невыполнимым. Какая гит-команда вызвала катастрофу? –

+0

'git clean -f' :( – Sai

+0

Да, это будет сделано. –

ответ

1

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

В Linux память, выделенная текущему процессу, доступна через /proc/###/mem, где ### представляет PID процесса.

Я не уверен, что исходный код Ruby фактически сохранен, он скомпилирован в байт-код перед его исполнением, но вы можете получить его версию, используя жемчужину ruby2ruby.

+0

FWIW Я использую OSX, ruby ​​1.9.2p290 (2011-07-09 revision 32553) [x86_64-darwin10.8.0]. – Sai

+0

Вы можете нужно немного сумасшедшим с чем-то вроде [nodewrap] (http://rubystuff.org/nodewrap/), чтобы вернуть этот материал. Лучшим решением было бы вернуться во времени и настроить Time Machine. часовое резервное копирование. – tadman

+1

Я также обнаружил [hijack] (https://github.com/ileitch/hijack), который позволяет запускать 'irb' в существующем Ruby-процессе. Оттуда вы можете делать всевозможные вещи. – tadman

-1

Все, что вам нужно сделать, это найти имя файла, связанного с программой рубина, а затем прочитать в содержимое этого файла с помощью File.read(file_name)

+0

задача состоит в том, чтобы захватить источник из процесса. – Reactormonk

+0

Если содержимое этого файла было изменено, слишком поздно для прямого подхода. – tadman

+0

Я не думаю, что вы читали вопрос, перила. Проблема заключается в том, что исходный файл * больше не существует *, просто работающий экземпляр. – Sai