Class: LLDB::Debugger

Inherits:
Object
  • Object
show all
Includes:
NativeLifecycle
Defined in:
lib/lldb/debugger.rb

Class Method Summary collapse

Instance Method Summary collapse

Methods included from NativeLifecycle

#closed?, #context, #context!, #ensure_open!, #initialize_native_object

Constructor Details

#initialize(ptr, context: Context.new) ⇒ Debugger

Returns a new instance of Debugger.

RBS:

  • ptr: FFI::Pointer

  • context: Context

  • return: void



21
22
23
24
25
26
27
28
# File 'lib/lldb/debugger.rb', line 21

def initialize(ptr, context: Context.new)
  @targets = [] # : Array[Target]
  initialize_native_object(
    ptr,
    release: ->(released) { FFIBindings.lldb_debugger_destroy(released) },
    context: context
  )
end

Class Method Details

.create(source_init_files: false) ⇒ Object

RBS:

  • return: Debugger

Raises:



10
11
12
13
14
15
16
# File 'lib/lldb/debugger.rb', line 10

def self.create(source_init_files: false)
  LLDB.ensure_initialized!
  ptr = FFIBindings.lldb_debugger_create_with_source_init_files(source_init_files ? 1 : 0)
  raise LLDBError, 'Failed to create debugger' if ptr.null?

  new(ptr, context: Context.new).tap { |debugger| LLDB.register_debugger(debugger) }
end

.release(ptr) ⇒ Object

RBS:

  • ptr: FFI::Pointer

  • return: ^(Integer) -> void



32
33
34
# File 'lib/lldb/debugger.rb', line 32

def self.release(ptr)
  ->(_id) { FFIBindings.lldb_debugger_destroy(ptr) unless ptr.null? }
end

.version_stringObject

RBS:

  • return: String?



168
169
170
# File 'lib/lldb/debugger.rb', line 168

def self.version_string
  FFIBindings.lldb_debugger_get_version_string
end

Instance Method Details

#async=(value) ⇒ Object

RBS:

  • value: bool

  • return: void

Raises:



132
133
134
135
136
# File 'lib/lldb/debugger.rb', line 132

def async=(value)
  raise InvalidObjectError, 'Debugger is not valid' unless valid?

  FFIBindings.lldb_debugger_set_async(@ptr, value ? 1 : 0)
end

#async?Boolean

RBS:

  • return: bool

Returns:

  • (Boolean)


124
125
126
127
128
# File 'lib/lldb/debugger.rb', line 124

def async?
  return false unless valid?

  FFIBindings.lldb_debugger_get_async(@ptr) != 0
end

#broadcasterObject

RBS:

  • return: Broadcaster

Raises:



183
184
185
186
187
188
189
190
# File 'lib/lldb/debugger.rb', line 183

def broadcaster
  raise InvalidObjectError, 'Debugger is not valid' unless valid?

  broadcaster_ptr = FFIBindings.lldb_debugger_get_broadcaster(@ptr)
  raise LLDBError, 'Failed to get debugger broadcaster' if broadcaster_ptr.nil? || broadcaster_ptr.null?

  Broadcaster.from_ptr(broadcaster_ptr, context: context)
end

#closeObject

RBS:

  • return: bool



42
43
44
45
46
47
48
49
# File 'lib/lldb/debugger.rb', line 42

def close
  return false if closed?

  context!.close(except: @native_handle)
  @native_handle.close
  @ptr = NativeHandle::NULL_POINTER
  true
end

#command_interpreterObject

RBS:

  • return: CommandInterpreter

Raises:



173
174
175
176
177
178
179
180
# File 'lib/lldb/debugger.rb', line 173

def command_interpreter
  raise InvalidObjectError, 'Debugger is not valid' unless valid?

  ci_ptr = FFIBindings.lldb_debugger_get_command_interpreter(@ptr)
  raise LLDBError, 'Failed to get command interpreter' if ci_ptr.nil? || ci_ptr.null?

  CommandInterpreter.new(ci_ptr, debugger: self, context: context)
end

#create_target(filename, arch: nil, platform: nil, add_dependent_modules: true) ⇒ Object

RBS:

  • filename: String

  • arch: String?

  • platform: String?

  • add_dependent_modules: bool

  • return: Target

Raises:



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/lldb/debugger.rb', line 56

def create_target(filename, arch: nil, platform: nil, add_dependent_modules: true)
  raise InvalidObjectError, 'Debugger is not valid' unless valid?

  error = Error.new
  target_ptr = FFIBindings.lldb_debugger_create_target(
    @ptr,
    filename.to_s,
    arch&.to_s,
    platform&.to_s,
    add_dependent_modules ? 1 : 0,
    error.to_ptr
  )

  error.raise_if_error!
  raise LLDBError, "Failed to create target for '#{filename}'" if target_ptr.nil? || target_ptr.null?

  target = Target.new(target_ptr, debugger: self, context: context)
  @targets << target
  target
end

#create_target_simple(filename) ⇒ Object

RBS:

  • filename: String

  • return: Target

Raises:



79
80
81
82
83
84
85
86
87
88
# File 'lib/lldb/debugger.rb', line 79

def create_target_simple(filename)
  raise InvalidObjectError, 'Debugger is not valid' unless valid?

  target_ptr = FFIBindings.lldb_debugger_create_target_simple(@ptr, filename.to_s)
  raise LLDBError, "Failed to create target for '#{filename}'" if target_ptr.nil? || target_ptr.null?

  target = Target.new(target_ptr, debugger: self, context: context)
  @targets << target
  target
end

#delete_target(target) ⇒ Object

RBS:

  • target: Target

  • return: bool

Raises:



148
149
150
151
152
153
154
# File 'lib/lldb/debugger.rb', line 148

def delete_target(target)
  raise InvalidObjectError, 'Debugger is not valid' unless valid?

  result = FFIBindings.lldb_debugger_delete_target(@ptr, target.to_ptr) != 0
  @targets.delete(target) if result
  result
end

#find_target_with_process_id(pid) ⇒ Object

RBS:

  • pid: Integer

  • return: Target?

Raises:



158
159
160
161
162
163
164
165
# File 'lib/lldb/debugger.rb', line 158

def find_target_with_process_id(pid)
  raise InvalidObjectError, 'Debugger is not valid' unless valid?

  target_ptr = FFIBindings.lldb_debugger_find_target_with_process_id(@ptr, pid)
  return nil if target_ptr.nil? || target_ptr.null?

  Target.new(target_ptr, debugger: self, context: context)
end

#handle_command(command) ⇒ Object

RBS:

  • command: String

  • return: void

Raises:



204
205
206
207
208
# File 'lib/lldb/debugger.rb', line 204

def handle_command(command)
  raise InvalidObjectError, 'Debugger is not valid' unless valid?

  FFIBindings.lldb_debugger_handle_command(@ptr, command)
end

#listenerObject

RBS:

  • return: Listener

Raises:



193
194
195
196
197
198
199
200
# File 'lib/lldb/debugger.rb', line 193

def listener
  raise InvalidObjectError, 'Debugger is not valid' unless valid?

  listener_ptr = FFIBindings.lldb_debugger_get_listener(@ptr)
  raise LLDBError, 'Failed to get debugger listener' if listener_ptr.nil? || listener_ptr.null?

  Listener.from_ptr(listener_ptr, context: context)
end

#num_targetsObject

RBS:

  • return: Integer



91
92
93
94
95
# File 'lib/lldb/debugger.rb', line 91

def num_targets
  return 0 unless valid?

  FFIBindings.lldb_debugger_get_num_targets(@ptr)
end

#selected_targetObject

RBS:

  • return: Target?

Raises:



109
110
111
112
113
114
115
116
# File 'lib/lldb/debugger.rb', line 109

def selected_target
  raise InvalidObjectError, 'Debugger is not valid' unless valid?

  target_ptr = FFIBindings.lldb_debugger_get_selected_target(@ptr)
  return nil if target_ptr.nil? || target_ptr.null?

  Target.new(target_ptr, debugger: self, context: context)
end

#selected_target=(target) ⇒ Object

RBS:

  • target: Target

  • return: void

Raises:



140
141
142
143
144
# File 'lib/lldb/debugger.rb', line 140

def selected_target=(target)
  raise InvalidObjectError, 'Debugger is not valid' unless valid?

  FFIBindings.lldb_debugger_set_selected_target(@ptr, target.to_ptr)
end

#target_at_index(index) ⇒ Object

RBS:

  • index: Integer

  • return: Target?

Raises:



99
100
101
102
103
104
105
106
# File 'lib/lldb/debugger.rb', line 99

def target_at_index(index)
  raise InvalidObjectError, 'Debugger is not valid' unless valid?

  target_ptr = FFIBindings.lldb_debugger_get_target_at_index(@ptr, index)
  return nil if target_ptr.nil? || target_ptr.null?

  Target.new(target_ptr, debugger: self, context: context)
end

#targetsObject

RBS:

  • return: Array[Target]



119
120
121
# File 'lib/lldb/debugger.rb', line 119

def targets
  (0...num_targets).map { |i| target_at_index(i) }.compact
end

#to_ptrObject

RBS:

  • return: FFI::Pointer



211
212
213
# File 'lib/lldb/debugger.rb', line 211

def to_ptr
  @ptr
end

#valid?Boolean

RBS:

  • return: bool

Returns:

  • (Boolean)


37
38
39
# File 'lib/lldb/debugger.rb', line 37

def valid?
  !@ptr.null? && FFIBindings.lldb_debugger_is_valid(@ptr) != 0
end