vivarium 0.3.2 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a0e7e80cef690342f163fde6c05fed6859c3ef81aa794fe532c87b00fbe11cd5
4
- data.tar.gz: 4f2de93c9795fe93ecb0d8291f86a117ac0f595c8c12e2c7b41caabaae7c3273
3
+ metadata.gz: 6549be32807adc904ffe18fbefc055600cf14c85c68b106a3abfd7dce354e8b1
4
+ data.tar.gz: 1f9c961424d4712b2c43ad3df8d81ee679ea2190acaa8ea24e78a4f88b92f452
5
5
  SHA512:
6
- metadata.gz: 9a116f2c50b978a368a05cca351411f9724686746820085b651038d060c8452a8546170cb6e6ac885ab8a721aa20bcf42c5746639d32cbfea0ba8a9452b9687e
7
- data.tar.gz: fb5b4b5307682fa84b77dcfaa2165a71a5e16deef8d7b7d21d6b3267e82b5a12ce1f73dee946193605e039a247d59613a9c2dffca15ef96ddb502a17c9ce742d
6
+ metadata.gz: ebe88587a6328a37703899da2f0c8275f9321d7ea34e1af9806dccfaf929a6ee45bce68378356aeb2171708936b74ebb33545ada8a7eace2774aa60783b31b24
7
+ data.tar.gz: f707b190642345628ddf613038942a87cd95585877b45a264e13ffb1c243da0b7576712d6b5e5eb65e336dab06ff95a01f329b383bdb0007aec879629c30d2eb
@@ -14,16 +14,15 @@ require "vivarium"
14
14
  require "vivarium/correlator"
15
15
  require "vivarium/tree_renderer"
16
16
  require "vivarium/display_filter"
17
- require "vivarium_usdt"
18
17
 
19
- t0 = 1_000_000_000 # base ktime_ns
20
- pid = Process.pid
21
- tid = Process.pid
22
- method_id = 0x0001_0001
18
+ t0 = 1_000_000_000 # base ktime_ns
19
+ pid = Process.pid
20
+ tid = Process.pid
23
21
 
24
- # span_start payload: method_id (8B) + file_id (8B) + lineno (8B)
25
- span_start_payload = [method_id, 0, 10].pack("q<q<q<")
26
- .ljust(Vivarium::EVENT_PAYLOAD_SIZE, "\x00")
22
+ # span_start payload: method_name (128B) + file_name (120B) + lineno (8B)
23
+ span_start_payload = "MyClass#my_method".ljust(Vivarium::SPAN_METHOD_SIZE, "\x00") +
24
+ "drop_demo.rb".ljust(Vivarium::SPAN_FILE_SIZE, "\x00") +
25
+ [10].pack("q<")
27
26
 
28
27
  events = [
29
28
  Vivarium::Correlator::RawEvent.new(
@@ -67,7 +66,6 @@ events = [
67
66
 
68
67
  Vivarium::TreeRenderer.new(
69
68
  events: events,
70
- method_table: { method_id => "MyClass#my_method" },
71
69
  observer_pid: pid,
72
70
  main_tid: tid,
73
71
  session_start_iso: "2026-06-02T00:00:00.000Z",
@@ -23,17 +23,15 @@ module Vivarium
23
23
 
24
24
  POLL_TIMEOUT_MS = 200
25
25
 
26
- def initialize(pin_dir:, observer_pid:, main_tid:, method_id_queue:, filter: nil, dest: $stdout)
26
+ def initialize(pin_dir:, observer_pid:, main_tid:, filter: nil, dest: $stdout)
27
27
  @pin_dir = pin_dir
28
28
  @observer_pid = observer_pid
29
29
  @main_tid = main_tid
30
- @method_id_queue = method_id_queue
31
30
  @filter = filter
32
31
  @dest = dest
33
32
 
34
33
  @events = []
35
34
  @events_mutex = Mutex.new
36
- @method_table = {}
37
35
  @stop_flag = false
38
36
  @started = false
39
37
 
@@ -66,15 +64,12 @@ module Vivarium
66
64
  @session_stop_ktime = Vivarium.monotonic_ktime_ns
67
65
 
68
66
  3.times { safe_poll(50) }
69
- drain_method_id_queue
70
67
 
71
68
  events_snapshot = @events_mutex.synchronize { @events.dup }
72
- method_table_snapshot = @method_table.dup
73
69
  @stopped = true
74
70
 
75
71
  TreeRenderer.new(
76
72
  events: events_snapshot,
77
- method_table: method_table_snapshot,
78
73
  observer_pid: @observer_pid,
79
74
  main_tid: @main_tid,
80
75
  session_start_iso: @session_start_iso,
@@ -91,7 +86,6 @@ module Vivarium
91
86
  def run
92
87
  until @stop_flag
93
88
  safe_poll(POLL_TIMEOUT_MS)
94
- drain_method_id_queue
95
89
  end
96
90
  end
97
91
 
@@ -126,17 +120,5 @@ module Vivarium
126
120
  warn "[vivarium correlator] capture error: #{e.class}: #{e.message}"
127
121
  end
128
122
 
129
- def drain_method_id_queue
130
- loop do
131
- msg = begin
132
- @method_id_queue.pop(true)
133
- rescue ThreadError
134
- return
135
- end
136
-
137
- method_id, signature = msg
138
- @method_table[method_id] = signature
139
- end
140
- end
141
123
  end
142
124
  end
@@ -28,7 +28,7 @@ module Vivarium
28
28
  UNRESOLVED_METHOD_PREFIX = "<method_id="
29
29
 
30
30
  Span = Struct.new(
31
- :tid, :method_id, :file_id, :lineno, :start_ktime, :stop_ktime, :exit_kind,
31
+ :tid, :method_name, :file_name, :lineno, :start_ktime, :stop_ktime, :exit_kind,
32
32
  :events, :descendant_pids, :synthetic, :raised,
33
33
  keyword_init: true
34
34
  ) do
@@ -52,11 +52,10 @@ module Vivarium
52
52
  EventNode = Struct.new(:kind, :name, :target, :offset_ns, :child_proc, keyword_init: true)
53
53
  ProcNode = Struct.new(:pid, :comm, :parent_pid, :children, keyword_init: true)
54
54
 
55
- def initialize(events:, method_table:, observer_pid:, main_tid:,
55
+ def initialize(events:, observer_pid:, main_tid:,
56
56
  session_start_iso:, session_start_ktime:,
57
57
  session_stop_iso:, session_stop_ktime:, filter: nil, dest:)
58
58
  @events = events
59
- @method_table = method_table
60
59
  @observer_pid = observer_pid
61
60
  @main_tid = main_tid
62
61
  @session_start_iso = session_start_iso
@@ -68,7 +67,6 @@ module Vivarium
68
67
 
69
68
  @pid_comm = { observer_pid => "ruby" }
70
69
  @pid_parent = {}
71
- @unresolved_method_ids = []
72
70
  end
73
71
 
74
72
  def render
@@ -101,11 +99,11 @@ module Vivarium
101
99
  events.each do |ev|
102
100
  case ev.event_name
103
101
  when "span_start"
104
- mid, fid, lno = read_span_payload(ev.payload)
102
+ method_name, file_name, lno = read_span_payload(ev.payload)
105
103
  span = Span.new(
106
104
  tid: ev.tid,
107
- method_id: mid,
108
- file_id: fid,
105
+ method_name: method_name,
106
+ file_name: file_name,
109
107
  lineno: lno,
110
108
  start_ktime: ev.ktime_ns,
111
109
  stop_ktime: nil,
@@ -195,8 +193,8 @@ module Vivarium
195
193
  def synthetic_span(start_ktime, stop_ktime)
196
194
  Span.new(
197
195
  tid: @main_tid,
198
- method_id: nil,
199
- file_id: nil,
196
+ method_name: nil,
197
+ file_name: nil,
200
198
  lineno: nil,
201
199
  start_ktime: start_ktime,
202
200
  stop_ktime: stop_ktime,
@@ -262,9 +260,6 @@ module Vivarium
262
260
  end
263
261
 
264
262
  def print_warnings
265
- @unresolved_method_ids.uniq.each do |mid|
266
- @dest.puts format("# warning method_id=0x%016X unresolved at render time", mid & 0xFFFF_FFFF_FFFF_FFFF)
267
- end
268
263
  end
269
264
 
270
265
  def print_observer_proc(spans)
@@ -301,25 +296,17 @@ module Vivarium
301
296
 
302
297
  def span_file_info(span)
303
298
  return "" if span.synthetic
304
- return "" unless span.file_id && span.file_id != -1
305
-
306
- file_name = Vivarium::Usdt.get_file_name(span.file_id)
307
- return "" unless file_name
299
+ return "" if span.file_name.nil? || span.file_name.empty?
308
300
 
309
301
  lno = span.lineno && span.lineno > 0 ? ":#{span.lineno}" : ""
310
- " at=#{File.basename(file_name)}#{lno}"
302
+ " at=#{File.basename(span.file_name)}#{lno}"
311
303
  end
312
304
 
313
305
  def span_display_name(span)
314
306
  return SYNTHETIC_SPAN_NAME if span.synthetic
315
- return SYNTHETIC_SPAN_NAME if span.method_id.nil?
316
-
317
- name = @method_table[span.method_id]
318
- name ||= Vivarium::Usdt.get_method_name(span.method_id)
319
- return name if name
307
+ return SYNTHETIC_SPAN_NAME if span.method_name.nil? || span.method_name.empty?
320
308
 
321
- @unresolved_method_ids << span.method_id
322
- format("#{UNRESOLVED_METHOD_PREFIX}0x%016X>", span.method_id & 0xFFFF_FFFF_FFFF_FFFF)
309
+ span.method_name
323
310
  end
324
311
 
325
312
  def build_span_children(span)
@@ -548,28 +535,20 @@ module Vivarium
548
535
 
549
536
  def render_raise_target(ev)
550
537
  bytes = ev.payload.to_s.b
551
- return "-" if bytes.bytesize < 8
552
-
553
- error_id = bytes[0, 8].unpack1("q<")
554
- message_id = bytes.bytesize >= 16 ? bytes[8, 8].unpack1("q<") : -1
555
- file_id = bytes.bytesize >= 24 ? bytes[16, 8].unpack1("q<") : -1
556
- lineno = bytes.bytesize >= 32 ? bytes[24, 8].unpack1("q<") : -1
557
-
558
- error_name = Vivarium::Usdt.get_error_name(error_id) ||
559
- format("0x%016X", error_id & 0xFFFF_FFFF_FFFF_FFFF)
560
-
561
- parts = ["error=#{error_name}"]
562
-
563
- if message_id != -1
564
- msg = Vivarium::Usdt.get_message_name(message_id)
565
- parts << "message=#{msg.inspect}" if msg
566
- end
567
-
568
- if file_id != -1 && (file_name = Vivarium::Usdt.get_file_name(file_id))
569
- lno = lineno && lineno > 0 ? ":#{lineno}" : ""
538
+ return "-" if bytes.empty?
539
+
540
+ slot = Vivarium::SPAN_RAISE_SLOT_SIZE
541
+ error_name = Vivarium.c_string(bytes[0, slot])
542
+ message = Vivarium.c_string(bytes[slot, slot])
543
+ file_name = Vivarium.c_string(bytes[slot * 2, slot])
544
+ lineno = bytes.bytesize > Vivarium::SPAN_RAISE_LINENO_OFFSET ? bytes[Vivarium::SPAN_RAISE_LINENO_OFFSET, 8].unpack1("q<") : -1
545
+
546
+ parts = ["error=#{error_name.empty? ? '?' : error_name}"]
547
+ parts << "message=#{message.inspect}" unless message.empty?
548
+ unless file_name.empty?
549
+ lno = lineno > 0 ? ":#{lineno}" : ""
570
550
  parts << "at=#{File.basename(file_name)}#{lno}"
571
551
  end
572
-
573
552
  parts.join(" ")
574
553
  end
575
554
 
@@ -589,12 +568,12 @@ module Vivarium
589
568
 
590
569
  def read_span_payload(payload)
591
570
  bytes = payload.to_s.b
592
- return [0, -1, -1] if bytes.bytesize < 8
571
+ return [nil, nil, -1] if bytes.empty?
593
572
 
594
- method_id = bytes[0, 8].unpack1("q<")
595
- file_id = bytes.bytesize >= 16 ? bytes[8, 8].unpack1("q<") : -1
596
- lineno = bytes.bytesize >= 24 ? bytes[16, 8].unpack1("q<") : -1
597
- [method_id, file_id, lineno]
573
+ method_name = Vivarium.c_string(bytes[0, Vivarium::SPAN_METHOD_SIZE])
574
+ file_name = Vivarium.c_string(bytes[Vivarium::SPAN_METHOD_SIZE, Vivarium::SPAN_FILE_SIZE])
575
+ lineno = bytes.bytesize > Vivarium::SPAN_LINENO_OFFSET ? bytes[Vivarium::SPAN_LINENO_OFFSET, 8].unpack1("q<") : -1
576
+ [method_name, file_name, lineno]
598
577
  end
599
578
 
600
579
  def read_proc_fork_child_pid(payload)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Vivarium
4
- VERSION = "0.3.2"
4
+ VERSION = "0.4.0"
5
5
  end
data/lib/vivarium.rb CHANGED
@@ -33,6 +33,15 @@ module Vivarium
33
33
  EVENT_DROPPED_OFFSET = 288
34
34
  EVENTS_RINGBUF_PAGES = 256
35
35
 
36
+ SPAN_METHOD_SIZE = 128
37
+ SPAN_FILE_SIZE = 120
38
+ SPAN_LINENO_OFFSET = SPAN_METHOD_SIZE + SPAN_FILE_SIZE # 248
39
+ SPAN_FILE_ARG_MAX = SPAN_FILE_SIZE - 1
40
+
41
+ SPAN_RAISE_SLOT_SIZE = 80
42
+ SPAN_RAISE_LINENO_OFFSET = SPAN_RAISE_SLOT_SIZE * 3 # 240
43
+ SPAN_RAISE_FILE_ARG_MAX = SPAN_RAISE_SLOT_SIZE - 1
44
+
36
45
  SSL_WRITE_PAYLOAD_DATA_LEN_OFFSET = 0
37
46
  SSL_WRITE_PAYLOAD_CAP_LEN_OFFSET = 4
38
47
  SSL_WRITE_PAYLOAD_DATA_OFFSET = 8
@@ -149,6 +158,16 @@ module Vivarium
149
158
  str[0, nul]
150
159
  end
151
160
 
161
+ def self.tail_fit_string(value, max_bytes, marker: "...")
162
+ str = value.to_s.b
163
+ return str if str.bytesize <= max_bytes
164
+ return str.byteslice(-max_bytes, max_bytes) || "" if max_bytes <= marker.bytesize
165
+
166
+ tail_size = max_bytes - marker.bytesize
167
+ tail = str.byteslice(-tail_size, tail_size) || ""
168
+ "#{marker}#{tail}"
169
+ end
170
+
152
171
  def self.event_severity(event_name)
153
172
  EVENT_SEVERITY_HIGH.include?(event_name.to_s) ? "high" : "medium"
154
173
  end
@@ -1394,19 +1413,19 @@ module Vivarium
1394
1413
  return 0;
1395
1414
  }
1396
1415
 
1397
- u64 method_id = 0;
1398
- u64 file_id = 0;
1399
- u64 lineno = 0;
1400
- bpf_usdt_readarg(1, ctx, &method_id);
1401
- bpf_usdt_readarg(2, ctx, &file_id);
1416
+ u64 method_str_ptr = 0;
1417
+ u64 file_str_ptr = 0;
1418
+ s64 lineno = 0;
1419
+ bpf_usdt_readarg(1, ctx, &method_str_ptr);
1420
+ bpf_usdt_readarg(2, ctx, &file_str_ptr);
1402
1421
  bpf_usdt_readarg(3, ctx, &lineno);
1403
1422
 
1404
1423
  struct event_t ev = {};
1405
1424
  ev.pid = pid;
1406
1425
  __builtin_memcpy(ev.event_name, "span_start", 11);
1407
- __builtin_memcpy(&ev.payload[0], &method_id, sizeof(method_id));
1408
- __builtin_memcpy(&ev.payload[8], &file_id, sizeof(file_id));
1409
- __builtin_memcpy(&ev.payload[16], &lineno, sizeof(lineno));
1426
+ bpf_probe_read_user_str(&ev.payload[0], #{SPAN_METHOD_SIZE}, (void*)method_str_ptr);
1427
+ bpf_probe_read_user_str(&ev.payload[#{SPAN_METHOD_SIZE}], #{SPAN_FILE_SIZE}, (void*)file_str_ptr);
1428
+ __builtin_memcpy(&ev.payload[#{SPAN_LINENO_OFFSET}], &lineno, sizeof(lineno));
1410
1429
  submit_event(&ev);
1411
1430
  return 0;
1412
1431
  }
@@ -1421,19 +1440,19 @@ module Vivarium
1421
1440
  return 0;
1422
1441
  }
1423
1442
 
1424
- u64 method_id = 0;
1425
- u64 file_id = 0;
1426
- u64 lineno = 0;
1427
- bpf_usdt_readarg(1, ctx, &method_id);
1428
- bpf_usdt_readarg(2, ctx, &file_id);
1443
+ u64 method_str_ptr = 0;
1444
+ u64 file_str_ptr = 0;
1445
+ s64 lineno = 0;
1446
+ bpf_usdt_readarg(1, ctx, &method_str_ptr);
1447
+ bpf_usdt_readarg(2, ctx, &file_str_ptr);
1429
1448
  bpf_usdt_readarg(3, ctx, &lineno);
1430
1449
 
1431
1450
  struct event_t ev = {};
1432
1451
  ev.pid = pid;
1433
1452
  __builtin_memcpy(ev.event_name, "span_stop", 10);
1434
- __builtin_memcpy(&ev.payload[0], &method_id, sizeof(method_id));
1435
- __builtin_memcpy(&ev.payload[8], &file_id, sizeof(file_id));
1436
- __builtin_memcpy(&ev.payload[16], &lineno, sizeof(lineno));
1453
+ bpf_probe_read_user_str(&ev.payload[0], #{SPAN_METHOD_SIZE}, (void*)method_str_ptr);
1454
+ bpf_probe_read_user_str(&ev.payload[#{SPAN_METHOD_SIZE}], #{SPAN_FILE_SIZE}, (void*)file_str_ptr);
1455
+ __builtin_memcpy(&ev.payload[#{SPAN_LINENO_OFFSET}], &lineno, sizeof(lineno));
1437
1456
  submit_event(&ev);
1438
1457
  return 0;
1439
1458
  }
@@ -1510,22 +1529,22 @@ module Vivarium
1510
1529
  return 0;
1511
1530
  }
1512
1531
 
1513
- u64 error_id = 0;
1514
- u64 message_id = 0;
1515
- u64 file_id = 0;
1516
- u64 lineno = 0;
1517
- bpf_usdt_readarg(1, ctx, &error_id);
1518
- bpf_usdt_readarg(2, ctx, &message_id);
1519
- bpf_usdt_readarg(3, ctx, &file_id);
1532
+ u64 error_str_ptr = 0;
1533
+ u64 message_str_ptr = 0;
1534
+ u64 file_str_ptr = 0;
1535
+ s64 lineno = 0;
1536
+ bpf_usdt_readarg(1, ctx, &error_str_ptr);
1537
+ bpf_usdt_readarg(2, ctx, &message_str_ptr);
1538
+ bpf_usdt_readarg(3, ctx, &file_str_ptr);
1520
1539
  bpf_usdt_readarg(4, ctx, &lineno);
1521
1540
 
1522
1541
  struct event_t ev = {};
1523
1542
  ev.pid = pid;
1524
1543
  __builtin_memcpy(ev.event_name, "span_raise", 11);
1525
- __builtin_memcpy(&ev.payload[0], &error_id, sizeof(error_id));
1526
- __builtin_memcpy(&ev.payload[8], &message_id, sizeof(message_id));
1527
- __builtin_memcpy(&ev.payload[16], &file_id, sizeof(file_id));
1528
- __builtin_memcpy(&ev.payload[24], &lineno, sizeof(lineno));
1544
+ bpf_probe_read_user_str(&ev.payload[0], #{SPAN_RAISE_SLOT_SIZE}, (void*)error_str_ptr);
1545
+ bpf_probe_read_user_str(&ev.payload[#{SPAN_RAISE_SLOT_SIZE}], #{SPAN_RAISE_SLOT_SIZE}, (void*)message_str_ptr);
1546
+ bpf_probe_read_user_str(&ev.payload[#{SPAN_RAISE_SLOT_SIZE * 2}], #{SPAN_RAISE_SLOT_SIZE}, (void*)file_str_ptr);
1547
+ __builtin_memcpy(&ev.payload[#{SPAN_RAISE_LINENO_OFFSET}], &lineno, sizeof(lineno));
1529
1548
  submit_event(&ev);
1530
1549
  return 0;
1531
1550
  }
@@ -1806,20 +1825,18 @@ module Vivarium
1806
1825
  pid = Process.pid
1807
1826
  store.register_pid(pid)
1808
1827
 
1809
- method_id_queue = Thread::Queue.new
1810
1828
  main_tid = gettid
1811
1829
 
1812
1830
  correlator = Correlator.new(
1813
1831
  pin_dir: pin_dir,
1814
1832
  observer_pid: pid,
1815
1833
  main_tid: main_tid,
1816
- method_id_queue: method_id_queue,
1817
1834
  filter: filter,
1818
1835
  dest: dest
1819
1836
  )
1820
1837
  correlator.start
1821
1838
 
1822
- tracer = build_observe_tracepoint(method_id_queue)
1839
+ tracer = build_observe_tracepoint
1823
1840
  tracer.enable
1824
1841
 
1825
1842
  session = ObservationSession.new(
@@ -1836,20 +1853,18 @@ module Vivarium
1836
1853
  pid = Process.pid
1837
1854
  store.register_pid(pid)
1838
1855
 
1839
- method_id_queue = Thread::Queue.new
1840
1856
  main_tid = gettid
1841
1857
 
1842
1858
  correlator = Correlator.new(
1843
1859
  pin_dir: pin_dir,
1844
1860
  observer_pid: pid,
1845
1861
  main_tid: main_tid,
1846
- method_id_queue: method_id_queue,
1847
1862
  filter: filter,
1848
1863
  dest: dest
1849
1864
  )
1850
1865
  correlator.start
1851
1866
 
1852
- tracer = build_observe_tracepoint(method_id_queue)
1867
+ tracer = build_observe_tracepoint
1853
1868
  tracer.enable
1854
1869
 
1855
1870
  yield
@@ -1859,20 +1874,19 @@ module Vivarium
1859
1874
  correlator&.stop
1860
1875
  end
1861
1876
 
1862
- def self.build_observe_tracepoint(method_id_queue)
1877
+ def self.build_observe_tracepoint
1863
1878
  allow_classes = SPAN_ALLOWCLASSES
1864
1879
  allowlist = SPAN_ALLOWLIST
1865
1880
  TracePoint.new(:call, :c_call, :return, :c_return, :raise) do |tp|
1866
1881
  if tp.event == :raise
1867
1882
  # FIXME: handle threaded events in the future
1868
- if tp.raised_exception.kind_of?(ThreadError)
1869
- next
1870
- end
1883
+ next if tp.raised_exception.kind_of?(ThreadError)
1871
1884
 
1885
+ file_arg = tail_fit_string(tp.path, SPAN_RAISE_FILE_ARG_MAX)
1872
1886
  Vivarium::Usdt.raise(
1873
1887
  tp.raised_exception.class.to_s,
1874
1888
  tp.raised_exception.message.to_s,
1875
- file: tp.path,
1889
+ file: file_arg,
1876
1890
  lineno: tp.lineno
1877
1891
  )
1878
1892
  next
@@ -1884,12 +1898,12 @@ module Vivarium
1884
1898
  allow_classes.any? { |klass| tp.defined_class == klass.singleton_class }
1885
1899
  next unless is_target
1886
1900
 
1901
+ file_arg = tail_fit_string(tp.path, SPAN_FILE_ARG_MAX)
1887
1902
  case tp.event
1888
1903
  when :call, :c_call
1889
- method_id = Vivarium::Usdt.start(tp.defined_class.to_s, tp.method_id.to_s, file: tp.path, lineno: tp.lineno)
1890
- method_id_queue << [method_id, signature]
1904
+ Vivarium::Usdt.start(tp.defined_class.to_s, tp.method_id.to_s, file: file_arg, lineno: tp.lineno)
1891
1905
  when :return, :c_return
1892
- Vivarium::Usdt.stop(tp.defined_class.to_s, tp.method_id.to_s, file: tp.path, lineno: tp.lineno)
1906
+ Vivarium::Usdt.stop(tp.defined_class.to_s, tp.method_id.to_s, file: file_arg, lineno: tp.lineno)
1893
1907
  end
1894
1908
  end
1895
1909
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vivarium
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Uchio Kondo
@@ -29,14 +29,14 @@ dependencies:
29
29
  requirements:
30
30
  - - "~>"
31
31
  - !ruby/object:Gem::Version
32
- version: 0.3.0
32
+ version: 0.4.0
33
33
  type: :runtime
34
34
  prerelease: false
35
35
  version_requirements: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
- version: 0.3.0
39
+ version: 0.4.0
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: ostruct
42
42
  requirement: !ruby/object:Gem::Requirement