Skip to content

Commit bb69399

Browse files
committed
Add Ruby seg fault exception tracing
Ruby seg faults contain a lot of useful information. When the lines are split across log entries, it makes debugging quite difficult.
1 parent 17c846b commit bb69399

File tree

2 files changed

+318
-2
lines changed

2 files changed

+318
-2
lines changed

lib/fluent/plugin/exception_detector.rb

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ module Fluent
1616
Struct.new('Rule', :from_states, :pattern, :to_state)
1717

1818
# Configuration of the state machine that detects exceptions.
19-
module ExceptionDetectorConfig
19+
module ExceptionDetectorConfig # rubocop:disable Metrics/ModuleLength
2020
# Rule for a state transition: if pattern matches go to the given state.
2121
class RuleTarget
2222
attr_accessor :pattern, :to_state
@@ -106,13 +106,59 @@ def self.supported
106106
rule(:go_frame_2, /^\s/, :go_frame_1)
107107
].freeze
108108

109-
RUBY_RULES = [
109+
RUBY_ERROR_RULES = [
110110
rule(:start_state, /Error \(.*\):$/, :ruby_before_rails_trace),
111111
rule(:ruby_before_rails_trace, /^ $/, :ruby),
112112
rule(:ruby_before_rails_trace, /^[\t ]+.*?\.rb:\d+:in `/, :ruby),
113113
rule(:ruby, /^[\t ]+.*?\.rb:\d+:in `/, :ruby)
114114
].freeze
115115

116+
RUBY_SEGFAULT_RULES = [
117+
rule(:start_state,
118+
/:\d+:\s\[BUG\] Segmentation fault/, :ruby_description),
119+
rule(:ruby_description, /^ruby\n*/, :ruby_description_end),
120+
rule(:ruby_description_end, /\n$/, :ruby_control_frame_begin),
121+
rule(:ruby_control_frame_begin,
122+
/^-- Control frame information --/, :ruby_control_frames),
123+
rule(:ruby_control_frames, /^c:/, :ruby_control_frames),
124+
rule(:ruby_control_frames, /^\n$/, :ruby_level_backtrace_frame_start),
125+
rule(:ruby_level_backtrace_frame_start,
126+
/-- Ruby level backtrace information --/,
127+
:ruby_level_backtrace_frames),
128+
rule(:ruby_level_backtrace_frames, /:\d+:in /,
129+
:ruby_level_backtrace_frames),
130+
rule(:ruby_level_backtrace_frames, /^\n$/, :ruby_level_backtrace_end),
131+
rule(:ruby_level_backtrace_end,
132+
/^-- Machine register context --/, :ruby_machine_registers),
133+
rule(:ruby_machine_registers, /: /, :ruby_machine_registers),
134+
rule(:ruby_machine_registers, /^\n$/, :ruby_machine_registers_end),
135+
rule(:ruby_machine_registers_end,
136+
/^-- C level backtrace information --/,
137+
:ruby_c_level_backtrace_frames),
138+
rule(:ruby_c_level_backtrace_frames, /\[.*\]/,
139+
:ruby_c_level_backtrace_frames),
140+
rule(:ruby_c_level_backtrace_frames, /^\n$/,
141+
:ruby_c_level_backtrace_end),
142+
rule(:ruby_c_level_backtrace_end,
143+
/^-- Other runtime information/, :ruby_other_runtime_info),
144+
rule(:ruby_other_runtime_info, /^\n$/, :ruby_other_runtime_info),
145+
rule(:ruby_other_runtime_info, /^* Loaded script:/, :ruby_loaded_script),
146+
rule(:ruby_loaded_script, /^\n$/, :ruby_loaded_features),
147+
rule(:ruby_loaded_features, /^* Loaded features:/, :ruby_loaded_features),
148+
rule(:ruby_loaded_features, /^\n$/, :ruby_loaded_features_frames),
149+
rule(:ruby_loaded_features_frames,
150+
/\d/, :ruby_loaded_features_frames),
151+
rule(:ruby_loaded_features_frames,
152+
/^\n$/, :ruby_process_memory_map),
153+
rule(:ruby_process_memory_map,
154+
/^* Process memory map:/, :ruby_process_memory_map),
155+
rule(:ruby_process_memory_map,
156+
/^\n$/, :ruby_process_memory_map_frames),
157+
rule(:ruby_process_memory_map_frames,
158+
/\-/, :ruby_process_memory_map_frames),
159+
rule(:ruby_process_memory_map_frames, /^\n$/, :start_state)
160+
].freeze
161+
116162
DART_RULES = [
117163
rule(:start_state, /^Unhandled exception:$/, :dart_exc),
118164
rule(:dart_exc, /^Instance of/, :dart_stack),
@@ -149,6 +195,10 @@ def self.supported
149195
rule(:dart_stack, /^<asynchronous suspension>$/, :dart_stack)
150196
].freeze
151197

198+
RUBY_RULES = (
199+
RUBY_ERROR_RULES + RUBY_SEGFAULT_RULES
200+
).freeze
201+
152202
ALL_RULES = (
153203
JAVA_RULES + PYTHON_RULES + PHP_RULES + GO_RULES + RUBY_RULES + DART_RULES
154204
).freeze

0 commit comments

Comments
 (0)