lldb 0.2.0 → 0.3.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.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +43 -4
  3. data/README.md +86 -2
  4. data/Rakefile +36 -0
  5. data/bindings/constants.yml +137 -0
  6. data/bindings/surface.yml +3072 -0
  7. data/ext/lldb/discovery.rb +101 -0
  8. data/ext/lldb/extconf.rb +206 -88
  9. data/ext/lldb/lldb_wrapper.cpp +7934 -877
  10. data/ext/lldb/lldb_wrapper.h +596 -333
  11. data/lib/lldb/address.rb +81 -0
  12. data/lib/lldb/api_support.rb +23 -6
  13. data/lib/lldb/attach_info.rb +122 -0
  14. data/lib/lldb/block.rb +121 -0
  15. data/lib/lldb/breakpoint.rb +11 -6
  16. data/lib/lldb/breakpoint_location.rb +20 -5
  17. data/lib/lldb/broadcaster.rb +79 -0
  18. data/lib/lldb/command_interpreter.rb +9 -4
  19. data/lib/lldb/command_return_object.rb +24 -5
  20. data/lib/lldb/compile_unit.rb +64 -0
  21. data/lib/lldb/context.rb +81 -0
  22. data/lib/lldb/debugger.rb +55 -12
  23. data/lib/lldb/error.rb +50 -3
  24. data/lib/lldb/event.rb +109 -0
  25. data/lib/lldb/expression_options.rb +124 -0
  26. data/lib/lldb/ffi_bindings.rb +313 -31
  27. data/lib/lldb/file_spec.rb +90 -0
  28. data/lib/lldb/file_spec_list.rb +78 -0
  29. data/lib/lldb/frame.rb +109 -17
  30. data/lib/lldb/function.rb +121 -0
  31. data/lib/lldb/instruction.rb +83 -0
  32. data/lib/lldb/instruction_list.rb +68 -0
  33. data/lib/lldb/launch_info.rb +145 -19
  34. data/lib/lldb/line_entry.rb +75 -0
  35. data/lib/lldb/listener.rb +96 -0
  36. data/lib/lldb/memory_region_info.rb +8 -3
  37. data/lib/lldb/module.rb +46 -5
  38. data/lib/lldb/native.rb +36 -0
  39. data/lib/lldb/native_buffer.rb +32 -0
  40. data/lib/lldb/native_handle.rb +60 -0
  41. data/lib/lldb/native_lifecycle.rb +64 -0
  42. data/lib/lldb/native_string_array.rb +34 -0
  43. data/lib/lldb/process.rb +102 -40
  44. data/lib/lldb/symbol.rb +117 -0
  45. data/lib/lldb/symbol_context.rb +9 -4
  46. data/lib/lldb/target.rb +69 -67
  47. data/lib/lldb/thread.rb +51 -18
  48. data/lib/lldb/type.rb +40 -3
  49. data/lib/lldb/type_member.rb +67 -0
  50. data/lib/lldb/types.rb +69 -4
  51. data/lib/lldb/value.rb +27 -17
  52. data/lib/lldb/value_list.rb +9 -5
  53. data/lib/lldb/version.rb +1 -1
  54. data/lib/lldb/watchpoint.rb +26 -9
  55. data/lib/lldb.rb +78 -10
  56. data/lldb.gemspec +4 -1
  57. data/rbs_collection.yaml +1 -1
  58. data/script/check_bindings +259 -0
  59. data/script/guard_c_exports +139 -0
  60. data/sig/lldb/ffi_bindings.rbs +247 -21
  61. data/sig/lldb/weak_ref.rbs +7 -0
  62. metadata +30 -6
  63. data/ext/lldb/Makefile +0 -24
  64. data/ext/lldb/liblldb_wrapper.dylib +0 -0
  65. data/ext/lldb/lldb_wrapper.o +0 -0
  66. data/ext/lldb/mkmf.log +0 -24
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2a9c4b0d0816a16700d8fc4e5b7bcb5e122875ead9fcfc8a2dde3c722e68d827
4
- data.tar.gz: 6268f8c9bea45f4947cdb5a95ca5d95603e1d322e16f2f4aa1267c84f258b84c
3
+ metadata.gz: 6e620343dac990365f90f32d8bd349abee9969a5f3cf51ddd255ab8b37e739ea
4
+ data.tar.gz: 527026156a888a96244a6687a31559bafcfb619b0c4eb91c96799689a02fbe90
5
5
  SHA512:
6
- metadata.gz: f305a6a355a1f599bd2706e8e9531c6a465ff17bf45aa3525bfac8f1c0a9f6cc3ecaf32bfc78f0ff7006b383094ad653e0656a5f994ab2a86335c632f57812d1
7
- data.tar.gz: cdbe16e161820379724b65595ce44d4d04f307f3edb1c9cae6f854b6088f90e7d7ea654799fef0f5126243e41c020e4b84a412a4b4dd7e03510db039c7f8eecf
6
+ metadata.gz: '087ad913a4adcc1db493e844ff844ea1fb6a86f01199606a9af606f5016d7e08a6fde5866842b9ffb7e1e2008e71d0e08e7de6094f1f9d6d51589239d9d0ee5d'
7
+ data.tar.gz: ebdfcbf627a830bc905cf41d80d5c6526039a96ae432f4c8fc1bcfec818c72486191d036a86a3c348cb4256c34739ba5d920b26578f13e47ac660e1e98efbcc7
data/CHANGELOG.md CHANGED
@@ -1,12 +1,51 @@
1
1
  # Changelog
2
2
 
3
- ## Unreleased
3
+ All notable changes to this project will be documented in this file.
4
4
 
5
- ## 0.2.0 - 2026-01-04
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/).
7
+
8
+ ## [Unreleased]
9
+
10
+ ## [0.3.0] - 2026-08-12
11
+
12
+ ### Added
13
+
14
+ - Expose thread step modes and command return statuses, and return `nil` from `Process#send_async_interrupt`.
15
+ - Add explicit broadcaster, listener, and event handles for LLDB state events.
16
+ - Add `source_init_files`, `LaunchInfo`, `AttachInfo`, and `ExpressionOptions` controls.
17
+ - Expose structured `FileSpec`, `Address`, `LineEntry`, and `FileSpecList` objects with dynamically sized path buffers and LLDB sentinel constants.
18
+ - Expose `TypeMember` metadata for fields and direct or virtual base classes.
19
+ - Expose structured `Symbol`, `Function`, `CompileUnit`, and `Block` objects from modules and frames.
20
+ - Expose structured instruction lists and instruction bytes from frames.
21
+ - Add LLDB discovery and compile/link validation for Linux and macOS builds.
22
+ - Expose wrapper ABI and LLDB version metadata with capability-based watchpoint access checks.
23
+ - Add binding parity, surface-ledger, reproducible RBS, and sanitizer checks.
24
+
25
+ ### Changed
26
+
27
+ - Preserve LLDB operation status, error type, and operation context.
28
+ - Make `Target#launch` preserve LLDB launch semantics without implicit flags, polling, or auto-continue.
29
+ - Release Ruby's GVL around launch, attach, continue, stepping, and command execution calls.
30
+ - Normalize basic type values across LLDB versions.
31
+ - Pin the RBS collection revision and verify generated RBS deterministically.
32
+
33
+ ### Fixed
34
+
35
+ - Report native wrapper exceptions as `InternalBindingError`.
36
+ - Add idempotent native handles, shared debugger contexts, and deterministic debugger close.
37
+ - Make native finalizer release safe under GC stress.
38
+ - Prevent native build artifacts from leaking into built gems.
39
+
40
+ ## [0.2.0] - 2026-01-04
41
+
42
+ ### Added
6
43
 
7
44
  - Add MemoryRegionInfo bindings.
8
45
  - Add APISupport module for feature detection.
9
46
 
10
- ## 0.1.0 - 2025-12-30
47
+ ## [0.1.0] - 2025-12-30
48
+
49
+ ### Added
11
50
 
12
- - Initial release.
51
+ - Initial release.
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # LLDB Ruby
1
+ # LLDB Ruby [![Gem Version](https://badge.fury.io/rb/lldb.svg)](https://badge.fury.io/rb/lldb) [![CI](https://github.com/ydah/lldb-ruby/actions/workflows/ci.yml/badge.svg)](https://github.com/ydah/lldb-ruby/actions/workflows/ci.yml)
2
2
 
3
3
  Ruby bindings for the LLDB debugger.
4
4
 
@@ -9,7 +9,7 @@ This gem provides Ruby bindings for LLDB (Low Level Debugger), allowing you to a
9
9
  ## Requirements
10
10
 
11
11
  - Ruby 3.0 or later
12
- - LLDB 14 or later
12
+ - LLDB 14 or later (Linux and macOS)
13
13
  - C++17 compatible compiler (gcc 8+ / clang 10+)
14
14
  - libffi-dev (for the FFI gem)
15
15
 
@@ -165,6 +165,53 @@ if var && var.valid?
165
165
  end
166
166
  ```
167
167
 
168
+ `Target#launch` passes the launch request directly to LLDB. It does not add
169
+ `STOP_AT_ENTRY`, wait for a state transition, or auto-continue to a breakpoint.
170
+ Set `launch_flags: LLDB::LaunchFlags::STOP_AT_ENTRY` explicitly when that
171
+ behavior is required; callers are responsible for waiting on asynchronous
172
+ processes.
173
+
174
+ ### Handling Events Explicitly
175
+
176
+ Use LLDB's listener queue when asynchronous state changes are needed:
177
+
178
+ ```ruby
179
+ listener = debugger.listener
180
+ broadcaster = process.broadcaster
181
+ listener.start_listening_for_events(broadcaster, LLDB::Process::BroadcastBit::STATE_CHANGED)
182
+
183
+ if (event = listener.wait_for_event(timeout_seconds: 1))
184
+ puts "state = #{LLDB::State.name(event.process_state)}"
185
+ end
186
+ ```
187
+
188
+ `timeout_seconds: 0` performs a non-blocking poll. The library does not start
189
+ background event threads.
190
+
191
+ Source locations remain structured when needed: `Frame#line_entry` exposes its
192
+ `LineEntry`, including `start_address`, `end_address`, file, line, and column;
193
+ `BreakpointLocation#address` exposes an `Address` with separate
194
+ `file_address` and `load_address` values. `FileSpecList` can collect and return
195
+ `FileSpec` objects without reducing them to path strings.
196
+
197
+ Type inspection also preserves member metadata. Use `Type#field_at_index`,
198
+ `#direct_base_class_at_index`, or `#virtual_base_class_at_index` to obtain a
199
+ `TypeMember` with its name, type, byte/bit offset, and bitfield width.
200
+
201
+ Modules and frames expose structured debug objects as well: use
202
+ `Module#symbol_at_index`, `Frame#function`, `Frame#symbol`,
203
+ `Frame#compile_unit`, and `Frame#block` to retain symbol, function, source
204
+ unit, and lexical block metadata.
205
+
206
+ For structured disassembly, use `Frame#instruction_list`. Each
207
+ `Instruction` exposes its address, mnemonic, operands, comment, byte size, and
208
+ raw bytes; the existing `Frame#disassemble` string API remains available.
209
+
210
+ Debugger and launch choices are explicit option objects. For example,
211
+ `LLDB::Debugger.create(source_init_files: true)` opts into LLDB init files,
212
+ while `LLDB::ExpressionOptions` can be passed to expression evaluation without
213
+ changing the no-options call path.
214
+
168
215
  ### Working with Threads
169
216
 
170
217
  ```ruby
@@ -196,8 +243,18 @@ process = target.attach(pid: 12345)
196
243
  - `LLDB::Thread` - Represents an execution thread
197
244
  - `LLDB::Frame` - Represents a stack frame
198
245
  - `LLDB::Breakpoint` - Represents a breakpoint
246
+ - `LLDB::BreakpointLocation` - Represents a breakpoint location
199
247
  - `LLDB::Value` - Represents a variable or expression result
248
+ - `LLDB::Type` - Represents debug type information
249
+ - `LLDB::TypeMember` - Represents a field or base-class member
200
250
  - `LLDB::Module` - Represents a loaded module
251
+ - `LLDB::Symbol` - Represents a symbol
252
+ - `LLDB::Function` - Represents a function
253
+ - `LLDB::CompileUnit` - Represents a compilation unit
254
+ - `LLDB::Block` - Represents a lexical block
255
+ - `LLDB::InstructionList` / `LLDB::Instruction` - Represents structured disassembly
256
+ - `LLDB::FileSpec` / `LLDB::Address` / `LLDB::LineEntry` - Represents source locations
257
+ - `LLDB::Listener` / `LLDB::Event` / `LLDB::Broadcaster` - Represents LLDB events
201
258
  - `LLDB::Error` - Represents an error from LLDB
202
259
 
203
260
  ### Constants
@@ -209,9 +266,22 @@ Process states are available in `LLDB::State`:
209
266
  Stop reasons are available in `LLDB::StopReason`:
210
267
  - `INVALID`, `NONE`, `TRACE`, `BREAKPOINT`, `WATCHPOINT`
211
268
  - `SIGNAL`, `EXCEPTION`, `EXEC`, `PLAN_COMPLETE`, `THREAD_EXITING`, `INSTRUMENTATION`
269
+ - `PROCESSOR_TRACE`, `FORK`, `VFORK`, `VFORK_DONE`
212
270
 
213
271
  ## Development
214
272
 
273
+ The native wrapper build discovers LLDB in this order:
274
+
275
+ 1. `--with-lldb-include` and `--with-lldb-lib`
276
+ 2. `--with-lldb-dir`
277
+ 3. `LLDB_DIR`
278
+ 4. `llvm-config` or a versioned `llvm-config-N` on `PATH`
279
+ 5. Homebrew, Xcode, and standard LLVM prefixes
280
+
281
+ Discovery succeeds only after compiling and linking a C++17 probe against
282
+ `liblldb`. The selected paths and optional API capabilities are printed during
283
+ the build. Windows is not a supported platform yet.
284
+
215
285
  After checking out the repo, run:
216
286
 
217
287
  ```bash
@@ -220,6 +290,20 @@ cd ext/lldb && ruby extconf.rb && make && cd ../..
220
290
  bundle exec rspec
221
291
  ```
222
292
 
293
+ Binding and type-surface checks can be run with:
294
+
295
+ ```bash
296
+ bundle exec rake bindings:check
297
+ bundle exec rake rbs:verify
298
+ ```
299
+
300
+ `bindings/surface.yml` records the classification and exception-safety review
301
+ for every native export. Update it together with any new header declaration.
302
+
303
+ Only calls that can wait for the inferior, debugger server, or command script
304
+ release Ruby's GVL. The wrapper does not invoke Ruby callbacks from those
305
+ calls; adding callback APIs requires revisiting this policy.
306
+
223
307
  To run tests, you need to compile the test fixtures:
224
308
 
225
309
  ```bash
data/Rakefile CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  require 'bundler/gem_tasks'
4
4
  require 'rspec/core/rake_task'
5
+ require 'shellwords'
6
+ require 'tmpdir'
5
7
 
6
8
  RSpec::Core::RakeTask.new(:spec)
7
9
 
@@ -47,6 +49,7 @@ task :clean do
47
49
  Dir.chdir(ext_dir) do
48
50
  system('make clean') if File.exist?('Makefile')
49
51
  FileUtils.rm_f('Makefile')
52
+ FileUtils.rm_f('lldb_wrapper_config.h')
50
53
  end
51
54
 
52
55
  FileUtils.rm_f(File.join(lib_dir, 'liblldb_wrapper.dylib'))
@@ -74,6 +77,39 @@ namespace :steep do
74
77
  end
75
78
  end
76
79
 
80
+ namespace :bindings do
81
+ desc 'Check native, FFI, RBS, and surface-ledger parity'
82
+ task check: :compile do
83
+ sh 'ruby script/check_bindings'
84
+ end
85
+ end
86
+
87
+ namespace :rbs do
88
+ desc 'Verify that generated RBS output is deterministic'
89
+ task :verify do
90
+ Dir.mktmpdir('lldb-ruby-rbs') do |directory|
91
+ outputs = %w[first second].map { |name| File.join(directory, name) }
92
+ outputs.each do |output|
93
+ sh "bundle exec rbs-inline --output=#{Shellwords.escape(output)} lib"
94
+ end
95
+
96
+ files = lambda do |root|
97
+ Dir.glob(File.join(root, '**/*.rbs')).map do |path|
98
+ path.delete_prefix("#{root}#{File::SEPARATOR}")
99
+ end.sort
100
+ end
101
+ first_files, second_files = outputs.map { |output| files.call(output) }
102
+ abort 'RBS output file set is not reproducible' unless first_files == second_files
103
+
104
+ first_files.each do |relative|
105
+ first = File.binread(File.join(outputs[0], relative))
106
+ second = File.binread(File.join(outputs[1], relative))
107
+ abort "RBS output is not reproducible: #{relative}" unless first == second
108
+ end
109
+ end
110
+ end
111
+ end
112
+
77
113
  desc 'Run steep type check'
78
114
  task steep: ['steep:check']
79
115
 
@@ -0,0 +1,137 @@
1
+ version: 1
2
+
3
+ constants:
4
+ - ruby: INVALID_ADDRESS
5
+ native: LLDB_INVALID_ADDRESS
6
+ - ruby: INVALID_PROCESS_ID
7
+ native: LLDB_INVALID_PROCESS_ID
8
+ - ruby: INVALID_THREAD_ID
9
+ native: LLDB_INVALID_THREAD_ID
10
+ - ruby: INVALID_BREAK_ID
11
+ native: LLDB_INVALID_BREAK_ID
12
+ - ruby: INVALID_LINE_NUMBER
13
+ native: LLDB_INVALID_LINE_NUMBER
14
+ - ruby: State::INVALID
15
+ native: lldb::eStateInvalid
16
+ - ruby: State::UNLOADED
17
+ native: lldb::eStateUnloaded
18
+ - ruby: State::CONNECTED
19
+ native: lldb::eStateConnected
20
+ - ruby: State::ATTACHING
21
+ native: lldb::eStateAttaching
22
+ - ruby: State::LAUNCHING
23
+ native: lldb::eStateLaunching
24
+ - ruby: State::STOPPED
25
+ native: lldb::eStateStopped
26
+ - ruby: State::RUNNING
27
+ native: lldb::eStateRunning
28
+ - ruby: State::STEPPING
29
+ native: lldb::eStateStepping
30
+ - ruby: State::CRASHED
31
+ native: lldb::eStateCrashed
32
+ - ruby: State::DETACHED
33
+ native: lldb::eStateDetached
34
+ - ruby: State::EXITED
35
+ native: lldb::eStateExited
36
+ - ruby: State::SUSPENDED
37
+ native: lldb::eStateSuspended
38
+ - ruby: StopReason::INVALID
39
+ native: lldb::eStopReasonInvalid
40
+ - ruby: StopReason::NONE
41
+ native: lldb::eStopReasonNone
42
+ - ruby: StopReason::TRACE
43
+ native: lldb::eStopReasonTrace
44
+ - ruby: StopReason::BREAKPOINT
45
+ native: lldb::eStopReasonBreakpoint
46
+ - ruby: StopReason::WATCHPOINT
47
+ native: lldb::eStopReasonWatchpoint
48
+ - ruby: StopReason::SIGNAL
49
+ native: lldb::eStopReasonSignal
50
+ - ruby: StopReason::EXCEPTION
51
+ native: lldb::eStopReasonException
52
+ - ruby: StopReason::EXEC
53
+ native: lldb::eStopReasonExec
54
+ - ruby: StopReason::PLAN_COMPLETE
55
+ native: lldb::eStopReasonPlanComplete
56
+ - ruby: StopReason::THREAD_EXITING
57
+ native: lldb::eStopReasonThreadExiting
58
+ - ruby: StopReason::INSTRUMENTATION
59
+ native: lldb::eStopReasonInstrumentation
60
+ - ruby: StopReason::PROCESSOR_TRACE
61
+ native: lldb::eStopReasonProcessorTrace
62
+ - ruby: StopReason::FORK
63
+ native: lldb::eStopReasonFork
64
+ - ruby: StopReason::VFORK
65
+ native: lldb::eStopReasonVFork
66
+ - ruby: StopReason::VFORK_DONE
67
+ native: lldb::eStopReasonVForkDone
68
+ - ruby: SymbolContextItem::TARGET
69
+ native: lldb::eSymbolContextTarget
70
+ - ruby: SymbolContextItem::MODULE
71
+ native: lldb::eSymbolContextModule
72
+ - ruby: SymbolContextItem::COMPILE_UNIT
73
+ native: lldb::eSymbolContextCompUnit
74
+ - ruby: SymbolContextItem::FUNCTION
75
+ native: lldb::eSymbolContextFunction
76
+ - ruby: SymbolContextItem::BLOCK
77
+ native: lldb::eSymbolContextBlock
78
+ - ruby: SymbolContextItem::LINE_ENTRY
79
+ native: lldb::eSymbolContextLineEntry
80
+ - ruby: SymbolContextItem::SYMBOL
81
+ native: lldb::eSymbolContextSymbol
82
+ - ruby: SymbolContextItem::EVERYTHING
83
+ native: lldb::eSymbolContextEverything
84
+ - ruby: SymbolContextItem::VARIABLE
85
+ native: lldb::eSymbolContextVariable
86
+ - ruby: ValueType::INVALID
87
+ native: lldb::eValueTypeInvalid
88
+ - ruby: ValueType::VARIABLE_GLOBAL
89
+ native: lldb::eValueTypeVariableGlobal
90
+ - ruby: ValueType::VARIABLE_STATIC
91
+ native: lldb::eValueTypeVariableStatic
92
+ - ruby: ValueType::VARIABLE_ARGUMENT
93
+ native: lldb::eValueTypeVariableArgument
94
+ - ruby: ValueType::VARIABLE_LOCAL
95
+ native: lldb::eValueTypeVariableLocal
96
+ - ruby: ValueType::REGISTER
97
+ native: lldb::eValueTypeRegister
98
+ - ruby: ValueType::REGISTER_SET
99
+ native: lldb::eValueTypeRegisterSet
100
+ - ruby: ValueType::CONSTANT_RESULT
101
+ native: lldb::eValueTypeConstResult
102
+ - ruby: ValueType::VARIABLE_THREAD_LOCAL
103
+ native: lldb::eValueTypeVariableThreadLocal
104
+ - ruby: ErrorType::INVALID
105
+ native: lldb::eErrorTypeInvalid
106
+ - ruby: ErrorType::GENERIC
107
+ native: lldb::eErrorTypeGeneric
108
+ - ruby: ErrorType::MACH_KERNEL
109
+ native: lldb::eErrorTypeMachKernel
110
+ - ruby: ErrorType::POSIX
111
+ native: lldb::eErrorTypePOSIX
112
+ - ruby: ErrorType::EXPRESSION
113
+ native: lldb::eErrorTypeExpression
114
+ - ruby: ErrorType::WIN32
115
+ native: lldb::eErrorTypeWin32
116
+ - ruby: ReturnStatus::INVALID
117
+ native: lldb::eReturnStatusInvalid
118
+ - ruby: ReturnStatus::SUCCESS_FINISH_NO_RESULT
119
+ native: lldb::eReturnStatusSuccessFinishNoResult
120
+ - ruby: ReturnStatus::SUCCESS_FINISH_RESULT
121
+ native: lldb::eReturnStatusSuccessFinishResult
122
+ - ruby: ReturnStatus::SUCCESS_CONTINUING_NO_RESULT
123
+ native: lldb::eReturnStatusSuccessContinuingNoResult
124
+ - ruby: ReturnStatus::SUCCESS_CONTINUING_RESULT
125
+ native: lldb::eReturnStatusSuccessContinuingResult
126
+ - ruby: ReturnStatus::STARTED
127
+ native: lldb::eReturnStatusStarted
128
+ - ruby: ReturnStatus::FAILED
129
+ native: lldb::eReturnStatusFailed
130
+ - ruby: ReturnStatus::QUIT
131
+ native: lldb::eReturnStatusQuit
132
+ - ruby: RunMode::ONLY_THIS_THREAD
133
+ native: lldb::eOnlyThisThread
134
+ - ruby: RunMode::ALL_THREADS
135
+ native: lldb::eAllThreads
136
+ - ruby: RunMode::ONLY_DURING_STEPPING
137
+ native: lldb::eOnlyDuringStepping