Регистрация всех вызовов методов в приложении Rails - PullRequest
8 голосов
/ 13 августа 2011

Есть ли простой способ регистрировать все вызовы методов в приложении Rails?

Мое основное использование для этого было бы в тестировании (и в тестах отладки). Я хочу иметь больше истории, чем обеспечивает трассировка стека (например, при запуске rspec с параметром -b).

Ответы [ 3 ]

18 голосов
/ 14 августа 2011

Это легко сделать.Просто добавьте 5 строк кода в ваш скрипт / сервер:

#!/usr/bin/env ruby
set_trace_func proc {
  |event, file, line, id, binding, classname| 
  if event == "call" or event == "return" 
    printf "%8s %s:%-2d %10s %8s\n", event, file, line, id, classname
  end
}

require File.expand_path('../../config/boot',  __FILE__)
require 'commands/server'

Это описано в http://phrogz.net/ProgrammingRuby/ospace.html#tracingyourprogramsexecution

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

3 голосов
/ 13 августа 2011

Perftools может дать вам то, что вы ищете.Он анализирует весь процесс и может дать вам графическое представление, которое выглядит примерно так: , как это . Rack perftools profiler - это rubygem, который использует perftools и упрощает интеграцию с приложением Rails, поэтому я бы порекомендовал пойти по этому пути, если вы захотите его попробовать.

0 голосов
/ 13 августа 2011

Во-первых, stacktrace - это каждый вызов метода, который был в стеке во время возникновения ошибки. Какие еще истории вы могли бы хотеть, кроме этого?

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...