Spec-Zone.ru › Ruby 2.7

класс TracePoint

Родитель:
Объект

Документ-класс: TracePoint

Класс, предоставляющий функциональность Kernel#set_trace_func в удобном объектно-ориентированном API.

Пример

Мы можем использовать TracePoint для сбора информации, специфичной для исключений:

trace = TracePoint.new(:raise) do |tp|
    p [tp.lineno, tp.event, tp.raised_exception]
end
#=> #<TracePoint:disabled>

trace.enable
#=> false

0 / 0
#=> [5, :raise, #<ZeroDivisionError: divided by 0>]

События

Если вы не укажете тип событий, на которые хотите подписаться, TracePoint включит все доступные события.

Примечание не полагайтесь на текущий набор событий, так как этот список может быть изменён. Вместо этого рекомендуется указать нужные типы событий.

Для фильтрации отслеживаемых событий можно передать любой из следующих:

:line

выполнение кода на новой строке

:class

начало определения класса или модуля

:end

окончание определения класса или модуля

:call

вызов метода Ruby

:return

возврат из метода Ruby

:c_call

вызов C-функции

:c_return

возврат из C-функции

:raise

выбрасывание исключения

:b_call

обработчик события при входе в блок

:b_return

обработчик события при завершении блока

:thread_begin

обработчик события при начале потока

:thread_end

обработчик события при завершении потока

:fiber_switch

обработчик события при переключении волокна

:script_compiled

компиляция нового кода Ruby (с eval, load или require)

Публичные методы класса

new(*events) { |obj| block } → obj Показать исходный код
# File trace_point.rb, line 95
def self.new(*events)
  __builtin_tracepoint_new_s(events)
end

Возвращает новый объект TracePoint, по умолчанию не активированный.

Далее, для активации отслеживания необходимо использовать TracePoint#enable

trace = TracePoint.new(:call) do |tp|
    p [tp.lineno, tp.defined_class, tp.method_id, tp.event]
end
#=> #<TracePoint:disabled>

trace.enable
#=> false

puts "Hello, TracePoint!"
# ...
# [48, IRB::Notifier::AbstractNotifier, :printf, :call]
# ...

Для деактивации отслеживания необходимо использовать TracePoint#disable

trace.disable

См. События в TracePoint для возможных событий и дополнительной информации.

Блок должен быть передан, в противном случае будет возбуждено исключение ArgumentError.

Если метод отслеживания не включён в заданный фильтр событий, возбуждается исключение RuntimeError.

TracePoint.trace(:line) do |tp|
    p tp.raised_exception
end
#=> RuntimeError: 'raised_exception' not supported by this event

Если метод отслеживания вызывается вне блока, возбуждается исключение RuntimeError.

TracePoint.trace(:line) do |tp|
  $tp = tp
end
$tp.lineno #=> access from outside (RuntimeError)

Доступ из других потоков также запрещён.

stat → obj Показать исходный код
# File trace_point.rb, line 117
def self.stat
  __builtin_tracepoint_stat_s
end

Возвращает внутреннюю информацию о TracePoint.

Содержимое возвращаемого значения зависит от реализации. Оно может быть изменено в будущем.

Этот метод предназначен только для отладки самого TracePoint.

trace(*events) { |obj| block } → obj Показать исходный код
# File trace_point.rb, line 134
def self.trace(*events)
  __builtin_tracepoint_trace_s(events)
end

Документ-метод: trace

A convenience method for TracePoint.new, that activates the trace
automatically.

       trace = TracePoint.trace(:call) { |tp| [tp.lineno, tp.event] }
       #=> #<TracePoint:enabled>

       trace.enabled? #=> true

Методы экземпляра Public

binding() Показать исходный код
# File trace_point.rb, line 313
def binding
  __builtin_tracepoint_attr_binding
end

Возвращает сгенерированный объект привязки из события

callee_id() Показать исходный код
# File trace_point.rb, line 272
def callee_id
  __builtin_tracepoint_attr_callee_id
end

Возвращает вызываемое имя вызываемого метода

defined_class() Показать исходный код
# File trace_point.rb, line 308
def defined_class
  __builtin_tracepoint_attr_defined_class
end

Возвращает класс или модуль вызываемого метода.

class C; def foo; end; end
trace = TracePoint.new(:call) do |tp|
  p tp.defined_class #=> C
end.enable do
  C.new.foo
end

Если метод определен модулем, возвращается этот модуль.

module M; def foo; end; end
class C; include M; end;
trace = TracePoint.new(:call) do |tp|
  p tp.defined_class #=> M
end.enable do
  C.new.foo
end

Примечание: defined_class возвращает класс-синглтон.

6-й параметр блока Kernel#set_trace_func передает исходный класс, прикреплённый к классу-синглтону.

Это различие между Kernel#set_trace_func и TracePoint.

class C; def self.foo; end; end
trace = TracePoint.new(:call) do |tp|
  p tp.defined_class #=> #<Class:C>
end.enable do
  C.foo
end
disable → true или false Показать исходный код
disable { блок } → obj
# File trace_point.rb, line 231
def disable
  __builtin_tracepoint_disable_m
end

Деактивирует отслеживание

Возвращает true, если отслеживание было включено. Возвращает false, если отслеживание было отключено.

trace.enabled?      #=> true
trace.disable       #=> true (previous status)
trace.enabled?      #=> false
trace.disable       #=> false

Если указан блок, отслеживание будет отключено только в рамках этого блока.

trace.enabled?
#=> true

trace.disable do
    trace.enabled?
    # only disabled for this block
end

trace.enabled?
#=> true

Примечание: Вы не можете получить доступ к обработчикам событий внутри блока.

trace.disable { p tp.lineno }
#=> RuntimeError: access from outside
enable(target: nil, target_line: nil, target_thread: nil) → true или false Показать исходный код
enable(target: nil, target_line: nil, target_thread: nil) { блок } → obj
# File trace_point.rb, line 195
def enable(target: nil, target_line: nil, target_thread: nil)
  __builtin_tracepoint_enable_m(target, target_line, target_thread)
end

Включает отслеживание.

Возвращает true если отслеживание было включено. Возвращает false если отслеживание было отключено.

trace.enabled?  #=> false
trace.enable    #=> false (previous state)
                #   trace is enabled
trace.enabled?  #=> true
trace.enable    #=> true (previous state)
                #   trace is still enabled

Если указан блок, отслеживание будет включено только в рамках этого блока.

trace.enabled?
#=> false

trace.enable do
  trace.enabled?
  # only enabled for this block
end

trace.enabled?
#=> false

Параметры target, target_line и target_thread используются для ограничения отслеживания только определёнными объектами кода. target должен быть объектом кода, для которого RubyVM::InstructionSequence.of вернёт последовательность инструкций.

t = TracePoint.new(:line) { |tp| p tp }

def m1
  p 1
end

def m2
  p 2
end

t.enable(target: method(:m1))

m1
# prints #<TracePoint:line@test.rb:5 in `m1'>
m2
# prints nothing

Примечание: Вы не можете получить доступ к обработчикам событий внутри enable блока.

trace.enable { p tp.lineno }
#=> RuntimeError: access from outside
enabled? → true или false Показать исходный код
# File trace_point.rb, line 239
def enabled?
  __builtin_tracepoint_enabled_p
end

Текущий статус отслеживания

eval_script() Показать исходный код
# File trace_point.rb, line 337
def eval_script
  __builtin_tracepoint_attr_eval_script
end

Скомпилированный исходный код (String) в методах *eval на событии :script_compiled. Если загружено из файла, возвращает nil.

event() Показать исходный код
# File trace_point.rb, line 246
def event
  __builtin_tracepoint_attr_event
end

Тип события

См. События в TracePoint для получения дополнительной информации.

inspect → строка Показать исходный код
# File trace_point.rb, line 104
def inspect
  __builtin_tracepoint_inspect
end

Возвращает строку, содержащую удобочитаемое состояние TracePoint.

instruction_sequence() Показать исходный код
# File trace_point.rb, line 345
def instruction_sequence
  __builtin_tracepoint_attr_instruction_sequence
end

Скомпилированная последовательность инструкций, представленная экземпляром RubyVM::InstructionSequence на событии :script_compiled.

Обратите внимание, что этот метод специфичен для MRI.

lineno() Показать исходный код
# File trace_point.rb, line 251
def lineno
  __builtin_tracepoint_attr_lineno
end

Номер строки события

method_id() Показать исходный код
# File trace_point.rb, line 267
def method_id
  __builtin_tracepoint_attr_method_id
end

Возвращает имя на уровне определения вызываемого метода

parameters() Показать исходный код
# File trace_point.rb, line 262
def parameters
  __builtin_tracepoint_attr_parameters
end

Возвращает определение параметров метода или блока, к которому относится текущая метка. Формат аналогичен формату для Method#parameters

path() Показать исходный код
# File trace_point.rb, line 256
def path
  __builtin_tracepoint_attr_path
end

Путь к исполняемому файлу

raised_exception() Показать исходный код
# File trace_point.rb, line 331
def raised_exception
  __builtin_tracepoint_attr_raised_exception
end

Значение исключения, поднятого на событии :raise

return_value() Показать исходный код
# File trace_point.rb, line 326
def return_value
  __builtin_tracepoint_attr_return_value
end

Возвращаемое значение с событиями :return, c_return, и b_return

self() Показать исходный код
# File trace_point.rb, line 321
def self
  __builtin_tracepoint_attr_self
end

Возвращает объект отслеживания во время события

То же, что и TracePoint#binding:

trace.binding.eval('self')

Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API