frame, thread и некоторые другие жаргоны в геме ruby-debug, что они значат? - PullRequest
3 голосов
/ 28 августа 2010

Я сейчас пытаюсь выучить гем ruby-debug, но есть много жаргонов, которые я не могу уловить. Хотите знать, кто-нибудь может помочь с объяснениями?

Я тоже не смог найти их в http://bashdb.sourceforge.net/ruby-debug.html. Автор предположил, что мы уже понимаем их (где я могу узнать о них в любом случае?).

Например, вот результат вызова help frame в rdb. Я беспомощно не понимаю всех вещей, которые я выделил.

Переместить текущий кадр в указанный кадр номер.

Отрицательное число указывает положение с другого конца. Итак, «кадр -1» перемещается в самый старый кадр, а 'кадр 0 'перемещается в самый новый кадр.

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

Если указан номер thread , тогда мы установить контекст для оценки выражений для этого кадра этого нить.

Ответы [ 2 ]

5 голосов
/ 28 августа 2010

Это не специфичный для Ruby жаргон;это характерно для большинства отладок.

Относительно кадров стека

Вы, вероятно, видели следы стека:

/usr/local/rvm/gems/ree-1.8.7-2010.02/gems/redgreen-1.2.2/lib/redgreen.rb:28:in `write': Broken pipe (Errno::EPIPE)
from /usr/local/rvm/gems/ree-1.8.7-2010.02/gems/redgreen-1.2.2/lib/redgreen.rb:28:in `output_single'
from /usr/local/rvm/rubies/ree-1.8.7-2010.02/lib/ruby/1.8/test/unit/ui/console/testrunner.rb:72:in `add_fault'
from /usr/local/rvm/rubies/ree-1.8.7-2010.02/lib/ruby/1.8/test/unit/ui/console/testrunner.rb:70:in `to_proc'
from /usr/local/rvm/rubies/ree-1.8.7-2010.02/lib/ruby/1.8/test/unit/util/observable.rb:78:in `call'

Полная трассировка показывает вам«стек вызовов».Строка вверху - это то место, где было сгенерировано исключение, а строки под ним показывают путь через ваш код, который программа прошла для достижения этой точки.Каждая из этих строк представляет собой уровень в стеке, называемый «кадром стека».Таким образом, когда генерируется исключение, текущий кадр стека является вершиной стека.Если вы переходите на frame -1, то вы переходите к нижней части стека вызовов.Думайте о стеке вызовов как о стеке тарелок.Когда вы вызываете функцию, вы добавляете пластину в стек, а когда вы выходите из этой функции, вы удаляете пластину из стека.Каждая тарелка это рама.Так как вы обычно заканчиваете тем, что вызываете функции внутри функций внутри функций, вы получаете довольно глубокие стеки вызовов, и обход их вверх и вниз может быть полезен при отладке для оценки локальных переменных и состояния в каждой точке стека вызовов.

Если вы хотите больше узнать о стеках вызовов, В Википедии есть хорошая статья .

Относительно потоков

Большинство всехсовременные языки программирования являются многопоточными, что означает, что они могут выполнять несколько путей кода (почти) одновременно.Итак, представьте, например, что у вас есть визуальное приложение, и вы выполняете некоторые дорогостоящие вычисления.Ваш графический пользовательский интерфейс не сможет реагировать на любые пользовательские данные, пока выполняются эти вычисления, что делает приложение замороженным для пользователя.Чтобы решить эту проблему, запустите два потока: один поток будет отвечать за принятие и обработку пользовательского ввода и рисование графического интерфейса, а другой поток будет отвечать за выполнение тяжелых вычислений.Ваш вычислительный поток может застрять в дорогостоящем цикле, а ваш поток графического интерфейса будет продолжать работать и рисовать графический интерфейс.

Если вы запускаете многопоточное приложение, тогда вам нужно выбрать, какой поток вы хотите оценитьваши команды отладки (выражения) в, так как каждый поток будет в разных точках вашего кода, и будет иметь разные стеки вызовов и разные локальные переменные и состояния и тому подобное.Это контекст оценки.

Однако я заметил, что это вопрос Rails, и Rails (по умолчанию) является однопоточным, поэтому вам не нужно беспокоиться о потоках.

1 голос
/ 28 августа 2010

Крис Хилд дал действительно фантастический ответ. Пара очень маленьких комментариев. Хотя Ruby Rails может быть однопоточным (по умолчанию), в зависимости от типа веб-сервера, на котором вы запускаете Ruby / Rails, общая программа (веб-сервер + Ruby / Rails) может больше не быть однопоточной.

Комментарий:

Так как текущая позиция перерисовывается, это может вызвать ресинкронизация, если есть фронт конец также следит за вещами.

Существуют некоторые отладочные интерфейсы, которые анализируют вывод, ища позицию исходного кода в выводе, чтобы фронт (например, текстовый редактор GNU / Emacs) мог показать вам, где вы находитесь. (Для GNU / Emacs это показывает это в другом окне редактора.) Когда вы переходите на другой кадр, этот фронт должен обновить дисплей, показывающий, где вы находитесь.

Хотя я знаю, что это относится к Emacs и старому интерфейсу отладчика ddd, я думаю, что у вас происходит то же самое, если вы отлаживаете от vim.

...