Spec-Zone.ru › Ruby 3

класс 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 включит все доступные события.

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

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

: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)
  Primitive.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
  Primitive.tracepoint_stat_s
end

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

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

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

trace(*events) { |obj| block } → obj Показать исходный код
# File trace_point.rb, line 134
def self.trace(*events)
  Primitive.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

Методы публичного экземпляра

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

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

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

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

defined_class() Показать исходный код
# File trace_point.rb, line 308
def defined_class
  Primitive.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 возвращает единственный класс.

Шестой параметр блока 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
  Primitive.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)
  Primitive.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:4 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?
  Primitive.tracepoint_enabled_p
end

Текущий статус трассировки

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

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

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

Тип события

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Аналогично TracePoint#binding:

trace.binding.eval('self')

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

Spec-Zone.ru

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