LLDB mainline
ScriptedProcess.cpp
Go to the documentation of this file.
1//===-- ScriptedProcess.cpp -----------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "ScriptedProcess.h"
10
11#include "lldb/Core/Debugger.h"
12#include "lldb/Core/Module.h"
14
22#include "lldb/Target/Queue.h"
26#include "lldb/Utility/State.h"
27
29
30using namespace lldb;
31using namespace lldb_private;
32
34
36 return "Scripted Process plug-in.";
37}
38
42
44 llvm::ArrayRef<lldb::ScriptLanguage> supported_languages =
45 llvm::ArrayRef(g_supported_script_languages);
46
47 return llvm::is_contained(supported_languages, language);
48}
49
51 lldb::ListenerSP listener_sp,
52 const FileSpec *file,
53 bool can_connect) {
54 if (!target_sp ||
55 !IsScriptLanguageSupported(target_sp->GetDebugger().GetScriptLanguage()))
56 return nullptr;
57
58 ScriptedMetadata scripted_metadata(target_sp->GetProcessLaunchInfo());
59
61 auto process_sp = std::shared_ptr<ScriptedProcess>(
62 new ScriptedProcess(target_sp, listener_sp, scripted_metadata, error));
63
64 if (error.Fail() || !process_sp || !process_sp->m_interface_up) {
65 LLDB_LOGF(GetLog(LLDBLog::Process), "%s", error.AsCString());
66 return nullptr;
67 }
68
69 return process_sp;
70}
71
73 bool plugin_specified_by_name) {
74 return true;
75}
76
78 lldb::ListenerSP listener_sp,
79 const ScriptedMetadata &scripted_metadata,
81 : Process(target_sp, listener_sp), m_scripted_metadata(scripted_metadata) {
82
83 if (!target_sp) {
85 "ScriptedProcess::%s () - ERROR: %s", __FUNCTION__, "Invalid target");
86 return;
87 }
88
89 ScriptInterpreter *interpreter =
90 target_sp->GetDebugger().GetScriptInterpreter();
91
92 if (!interpreter) {
94 "ScriptedProcess::%s () - ERROR: %s", __FUNCTION__,
95 "Debugger has no Script Interpreter");
96 return;
97 }
98
99 // Create process instance interface
101 if (!m_interface_up) {
103 "ScriptedProcess::%s () - ERROR: %s", __FUNCTION__,
104 "Script interpreter couldn't create Scripted Process Interface");
105 return;
106 }
107
108 ExecutionContext exe_ctx(target_sp, /*get_process=*/false);
109
110 // Create process script object
111 auto obj_or_err = GetInterface().CreatePluginObject(
112 m_scripted_metadata.GetClassName(), exe_ctx,
113 m_scripted_metadata.GetArgsSP());
114
115 if (!obj_or_err) {
116 llvm::consumeError(obj_or_err.takeError());
117 error = Status::FromErrorString("Failed to create script object.");
118 return;
119 }
120
121 StructuredData::GenericSP object_sp = *obj_or_err;
122
123 if (!object_sp || !object_sp->IsValid()) {
125 "ScriptedProcess::%s () - ERROR: %s", __FUNCTION__,
126 "Failed to create valid script object");
127 return;
128 }
129}
130
132 Clear();
133 // If the interface is not valid, we can't call Finalize(). When that happens
134 // it means that the Scripted Process instanciation failed and the
135 // CreateProcess function returns a nullptr, so no one besides this class
136 // should have access to that bogus process object.
137 if (!m_interface_up)
138 return;
139 // We need to call finalize on the process before destroying ourselves to
140 // make sure all of the broadcaster cleanup goes as planned. If we destruct
141 // this class, then Process::~Process() might have problems trying to fully
142 // destroy the broadcaster.
143 Finalize(true /* destructing */);
144}
145
150
154
157
158 return DoLaunch(nullptr, launch_info);
159}
160
162 ProcessLaunchInfo &launch_info) {
163 LLDB_LOGF(GetLog(LLDBLog::Process), "ScriptedProcess::%s launching process", __FUNCTION__);
164
165 /* MARK: This doesn't reflect how lldb actually launches a process.
166 In reality, it attaches to debugserver, then resume the process.
167 That's not true in all cases. If debugserver is remote, lldb
168 asks debugserver to launch the process for it. */
171 return error;
172}
173
175
177 // Update the PID again, in case the user provided a placeholder pid at launch
179}
180
182 LLDB_LOGF(GetLog(LLDBLog::Process), "ScriptedProcess::%s resuming process", __FUNCTION__);
183
184 if (direction == RunDirection::eRunForward)
185 return GetInterface().Resume();
186 // FIXME: Pipe reverse continue through Scripted Processes
188 "{0} does not support reverse execution of processes", GetPluginName());
189}
190
192 Status error = GetInterface().Attach(attach_info);
195 if (error.Fail())
196 return error;
197 // NOTE: We need to set the PID before finishing to attach otherwise we will
198 // hit an assert when calling the attach completion handler.
199 DidLaunch();
200
201 return {};
202}
203
204Status
206 const ProcessAttachInfo &attach_info) {
207 return DoAttach(attach_info);
208}
209
211 const char *process_name, const ProcessAttachInfo &attach_info) {
212 return DoAttach(attach_info);
213}
214
216 process_arch = GetArchitecture();
217}
218
220
222
223size_t ScriptedProcess::DoReadMemory(lldb::addr_t addr, void *buf, size_t size,
224 Status &error) {
225 lldb::DataExtractorSP data_extractor_sp =
227
228 if (!data_extractor_sp || !data_extractor_sp->HasData() || error.Fail())
229 return 0;
230
231 offset_t bytes_copied = data_extractor_sp->CopyByteOrderedData(
232 0, data_extractor_sp->GetByteSize(), buf, size, GetByteOrder());
233
234 if (!bytes_copied || bytes_copied == LLDB_INVALID_OFFSET)
236 LLVM_PRETTY_FUNCTION, "Failed to copy read memory to buffer.", error);
237
238 // FIXME: We should use the diagnostic system to report a warning if the
239 // `bytes_copied` is different from `size`.
240
241 return bytes_copied;
242}
243
244size_t ScriptedProcess::DoWriteMemory(lldb::addr_t vm_addr, const void *buf,
245 size_t size, Status &error) {
246 lldb::DataExtractorSP data_extractor_sp = std::make_shared<DataExtractor>(
247 buf, size, GetByteOrder(), GetAddressByteSize());
248
249 if (!data_extractor_sp || !data_extractor_sp->HasData())
250 return 0;
251
252 lldb::offset_t bytes_written =
253 GetInterface().WriteMemoryAtAddress(vm_addr, data_extractor_sp, error);
254
255 if (!bytes_written || bytes_written == LLDB_INVALID_OFFSET)
257 LLVM_PRETTY_FUNCTION, "Failed to copy write buffer to memory.", error);
258
259 // FIXME: We should use the diagnostic system to report a warning if the
260 // `bytes_written` is different from `size`.
261
262 return bytes_written;
263}
264
266 assert(bp_site != nullptr);
267
268 if (bp_site->IsEnabled()) {
269 return {};
270 }
271
272 if (bp_site->HardwareRequired()) {
274 "Scripted Processes don't support hardware breakpoints");
275 }
276
279
280 return error;
281}
282
286
288 MemoryRegionInfo &region) {
290 if (auto region_or_err =
291 GetInterface().GetMemoryRegionContainingAddress(load_addr, error))
292 region = *region_or_err;
293
294 return error;
295}
296
299 lldb::addr_t address = 0;
300
301 while (auto region_or_err =
302 GetInterface().GetMemoryRegionContainingAddress(address, error)) {
303 if (error.Fail())
304 break;
305
306 MemoryRegionInfo &mem_region = *region_or_err;
307 auto range = mem_region.GetRange();
308 address += range.GetRangeBase() + range.GetByteSize();
309 region_list.push_back(mem_region);
310 }
311
312 return error;
313}
314
316
318 ThreadList &new_thread_list) {
319 // TODO: Implement
320 // This is supposed to get the current set of threads, if any of them are in
321 // old_thread_list then they get copied to new_thread_list, and then any
322 // actually new threads will get added to new_thread_list.
323 m_thread_plans.ClearThreadCache();
324
327
328 if (!thread_info_sp)
330 LLVM_PRETTY_FUNCTION,
331 "Couldn't fetch thread list from Scripted Process.", error);
332
333 // Because `StructuredData::Dictionary` uses a `std::map<ConstString,
334 // ObjectSP>` for storage, each item is sorted based on the key alphabetical
335 // order. Since `GetThreadsInfo` provides thread indices as the key element,
336 // thread info comes ordered alphabetically, instead of numerically, so we
337 // need to sort the thread indices before creating thread.
338
339 StructuredData::ArraySP keys = thread_info_sp->GetKeys();
340
341 std::map<size_t, StructuredData::ObjectSP> sorted_threads;
342 auto sort_keys = [&sorted_threads,
343 &thread_info_sp](StructuredData::Object *item) -> bool {
344 if (!item)
345 return false;
346
347 llvm::StringRef key = item->GetStringValue();
348 size_t idx = 0;
349
350 // Make sure the provided index is actually an integer
351 if (!llvm::to_integer(key, idx))
352 return false;
353
354 sorted_threads[idx] = thread_info_sp->GetValueForKey(key);
355 return true;
356 };
357
358 size_t thread_count = thread_info_sp->GetSize();
359
360 if (!keys->ForEach(sort_keys) || sorted_threads.size() != thread_count)
361 // Might be worth showing the unsorted thread list instead of return early.
363 LLVM_PRETTY_FUNCTION, "Couldn't sort thread list.", error);
364
365 auto create_scripted_thread =
366 [this, &error, &new_thread_list](
367 const std::pair<size_t, StructuredData::ObjectSP> pair) -> bool {
368 size_t idx = pair.first;
369 StructuredData::ObjectSP object_sp = pair.second;
370
371 if (!object_sp)
373 LLVM_PRETTY_FUNCTION, "Invalid thread info object", error);
374
375 auto thread_or_error =
376 ScriptedThread::Create(*this, object_sp->GetAsGeneric());
377
378 if (!thread_or_error)
380 LLVM_PRETTY_FUNCTION, toString(thread_or_error.takeError()), error);
381
382 ThreadSP thread_sp = thread_or_error.get();
383 lldbassert(thread_sp && "Couldn't initialize scripted thread.");
384
385 RegisterContextSP reg_ctx_sp = thread_sp->GetRegisterContext();
386 if (!reg_ctx_sp)
388 LLVM_PRETTY_FUNCTION,
389 llvm::Twine("Invalid Register Context for thread " + llvm::Twine(idx))
390 .str(),
391 error);
392
393 new_thread_list.AddThread(thread_sp);
394
395 return true;
396 };
397
398 llvm::for_each(sorted_threads, create_scripted_thread);
399
400 return new_thread_list.GetSize(false) > 0;
401}
402
404 // Let all threads recover from stopping and do any clean up based on the
405 // previous thread state (if any).
406 m_thread_list.RefreshStateAfterStop();
407}
408
410 info.Clear();
411 info.SetProcessID(GetID());
414 if (module_sp) {
415 const bool add_exe_file_as_first_arg = false;
416 info.SetExecutableFile(GetTarget().GetExecutableModule()->GetFileSpec(),
417 add_exe_file_as_first_arg);
418 }
419 return true;
420}
421
424 BinaryInformationLevel info_level) {
426 auto error_with_message = [&error](llvm::StringRef message) {
427 return ScriptedInterface::ErrorWithMessage<bool>(LLVM_PRETTY_FUNCTION,
428 message.data(), error);
429 };
430
432
433 if (!loaded_images_sp || !loaded_images_sp->GetSize())
435 LLVM_PRETTY_FUNCTION, "No loaded images.", error);
436
437 ModuleList module_list;
438 Target &target = GetTarget();
439
440 auto reload_image = [&target, &module_list, &error_with_message](
441 StructuredData::Object *obj) -> bool {
443
444 if (!dict)
445 return error_with_message("Couldn't cast image object into dictionary.");
446
447 ModuleSpec module_spec;
448
449 bool has_path = dict->HasKey("path");
450 bool has_uuid = dict->HasKey("uuid");
451 if (!has_path && !has_uuid)
452 return error_with_message("Dictionary should have key 'path' or 'uuid'");
453 if (!dict->HasKey("load_addr"))
454 return error_with_message("Dictionary is missing key 'load_addr'");
455
456 llvm::StringRef path = "";
457 if (has_path) {
458 dict->GetValueForKeyAsString("path", path);
459 module_spec.GetFileSpec().SetPath(path);
460 }
461
462 llvm::StringRef uuid = "";
463 if (has_uuid) {
464 dict->GetValueForKeyAsString("uuid", uuid);
465 module_spec.GetUUID().SetFromStringRef(uuid);
466 }
467
470 dict->GetValueForKeyAsInteger("load_addr", load_addr);
471 dict->GetValueForKeyAsInteger("slide", slide);
472 if (load_addr == LLDB_INVALID_ADDRESS)
473 return error_with_message(
474 "Couldn't get valid load address or slide offset.");
475
476 if (slide != LLDB_INVALID_OFFSET)
477 load_addr += slide;
478
479 module_spec.GetArchitecture() = target.GetArchitecture();
480
481 ModuleSP module_sp =
482 target.GetOrCreateModule(module_spec, true /* notify */);
483
484 bool is_placeholder_module = false;
485
486 if (!module_sp) {
487 // Create a placeholder module
488 LLDB_LOGF(
490 "ScriptedProcess::%s unable to locate the matching "
491 "object file path %s, creating a placeholder module at 0x%" PRIx64,
492 __FUNCTION__, path.str().c_str(), load_addr);
493
495 module_spec, load_addr, module_spec.GetFileSpec().MemorySize());
496
497 is_placeholder_module = true;
498 }
499
500 bool changed = false;
501 module_sp->SetLoadAddress(target, load_addr, false /*=value_is_offset*/,
502 changed);
503
504 if (!changed && !module_sp->GetObjectFile())
505 return error_with_message("Couldn't set the load address for module.");
506
507 FileSpec objfile(path);
508 module_sp->SetFileSpecAndObjectName(objfile, objfile.GetFilename());
509
510 if (is_placeholder_module) {
511 target.GetImages().AppendIfNeeded(module_sp, true /*notify=*/);
512 return true;
513 }
514
515 return module_list.AppendIfNeeded(module_sp);
516 };
517
518 size_t loaded_images_size = loaded_images_sp->GetSize();
519 bool print_error = true;
520 for (size_t idx = 0; idx < loaded_images_size; idx++) {
521 const auto &loaded_image = loaded_images_sp->GetItemAtIndex(idx);
522 if (!reload_image(loaded_image.get()) && print_error) {
523 print_error = false;
525 LLVM_PRETTY_FUNCTION, "Couldn't reload all images.", error);
526 }
527 }
528
529 target.ModulesDidLoad(module_list);
530
531 return loaded_images_sp;
532}
533
536
538 if (!metadata_sp || !metadata_sp->GetSize())
540 LLVM_PRETTY_FUNCTION, "No metadata.", error);
541
542 return metadata_sp;
543}
544
547 for (ThreadSP thread_sp : Threads()) {
548 if (const char *queue_name = thread_sp->GetQueueName()) {
549 QueueSP queue_sp = std::make_shared<Queue>(
550 m_process->shared_from_this(), thread_sp->GetQueueID(), queue_name);
551 m_queue_list.AddQueue(queue_sp);
552 }
553 }
554}
555
560
562 StructuredData::GenericSP object_instance_sp =
564 if (object_instance_sp &&
565 object_instance_sp->GetType() == eStructuredDataTypeGeneric)
566 return object_instance_sp->GetAsGeneric()->GetValue();
567 return nullptr;
568}
static llvm::raw_ostream & error(Stream &strm)
#define lldbassert(x)
Definition LLDBAssert.h:16
#define LLDB_LOGF(log,...)
Definition Log.h:378
#define LLDB_PLUGIN_DEFINE(PluginName)
static constexpr lldb::ScriptLanguage g_supported_script_languages[]
An architecture specification class.
Definition ArchSpec.h:32
Class that manages the actual breakpoint that will be inserted into the running program.
bool IsEnabled() const
Tells whether the current breakpoint site is enabled or not.
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
A file utility class.
Definition FileSpec.h:57
const ConstString & GetFilename() const
Filename string const get accessor.
Definition FileSpec.h:250
void SetPath(llvm::StringRef p)
Temporary helper for FileSystem change.
Definition FileSpec.h:289
size_t MemorySize() const
Get the memory cost of this object.
Definition FileSpec.cpp:420
A collection class for Module objects.
Definition ModuleList.h:125
bool AppendIfNeeded(const lldb::ModuleSP &new_module, bool notify=true)
Append a module to the module list, if it is not already there.
FileSpec & GetFileSpec()
Definition ModuleSpec.h:57
ArchSpec & GetArchitecture()
Definition ModuleSpec.h:93
A class that describes an executable image and its associated object and symbol files.
Definition Module.h:90
static lldb::ModuleSP CreateModuleFromObjectFile(Args &&...args)
Definition Module.h:135
static bool RegisterPlugin(llvm::StringRef name, llvm::StringRef description, ABICreateInstance create_callback)
static bool UnregisterPlugin(ABICreateInstance create_callback)
void SetExecutableFile(const FileSpec &exe_file, bool add_exe_file_as_first_arg)
void SetArchitecture(const ArchSpec &arch)
Definition ProcessInfo.h:66
void SetProcessID(lldb::pid_t pid)
Definition ProcessInfo.h:70
lldb::pid_t GetID() const
Returns the pid of the process or LLDB_INVALID_PROCESS_ID if there is no known pid.
Definition Process.h:538
Process(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp)
Construct with a shared pointer to a target, and the Process listener.
Definition Process.cpp:432
QueueList m_queue_list
The list of libdispatch queues at a given stop point.
Definition Process.h:3434
lldb::ByteOrder GetByteOrder() const
Definition Process.cpp:3770
ThreadList::ThreadIterable Threads()
Definition Process.h:2325
ThreadPlanStackMap m_thread_plans
This is the list of thread plans for threads in m_thread_list, as well as threads we knew existed,...
Definition Process.h:3423
friend class Target
Definition Process.h:361
uint32_t GetAddressByteSize() const
Definition Process.cpp:3774
void SetPrivateState(lldb::StateType state)
Definition Process.cpp:1379
virtual void Finalize(bool destructing)
This object is about to be destroyed, do any necessary cleanup.
Definition Process.cpp:542
ThreadList m_thread_list
The threads for this process as the user will see them.
Definition Process.h:3419
lldb::pid_t m_pid
Definition Process.h:3387
friend class ThreadList
Definition Process.h:362
Target & GetTarget()
Get the target object pointer for this module.
Definition Process.h:1251
virtual lldb::ScriptedProcessInterfaceUP CreateScriptedProcessInterface()
static Ret ErrorWithMessage(llvm::StringRef caller_name, llvm::StringRef error_msg, Status &error, LLDBLog log_category=LLDBLog::Process)
StructuredData::GenericSP GetScriptObjectInstance()
virtual lldb::DataExtractorSP ReadMemoryAtAddress(lldb::addr_t address, size_t size, Status &error)
virtual StructuredData::DictionarySP GetThreadsInfo()
virtual Status Attach(const ProcessAttachInfo &attach_info)
virtual bool CreateBreakpoint(lldb::addr_t addr, Status &error)
virtual StructuredData::DictionarySP GetMetadata()
virtual StructuredData::ArraySP GetLoadedImages()
virtual lldb::offset_t WriteMemoryAtAddress(lldb::addr_t addr, lldb::DataExtractorSP data_sp, Status &error)
virtual llvm::Expected< StructuredData::GenericSP > CreatePluginObject(llvm::StringRef class_name, ExecutionContext &exe_ctx, StructuredData::DictionarySP args_sp, StructuredData::Generic *script_obj=nullptr)=0
Status DoAttachToProcessWithID(lldb::pid_t pid, const ProcessAttachInfo &attach_info) override
Attach to an existing process using a process ID.
bool CanDebug(lldb::TargetSP target_sp, bool plugin_specified_by_name) override
Check if a plug-in instance can debug the file in module.
bool DoUpdateThreadList(ThreadList &old_thread_list, ThreadList &new_thread_list) override
Update the thread list following process plug-in's specific logic.
size_t DoReadMemory(lldb::addr_t addr, void *buf, size_t size, Status &error) override
Actually do the reading of memory from a process.
const ScriptedMetadata m_scripted_metadata
void DidAttach(ArchSpec &process_arch) override
Called after attaching a process.
static llvm::StringRef GetPluginNameStatic()
Status GetMemoryRegions(lldb_private::MemoryRegionInfos &region_list) override
Obtain all the mapped memory regions within this process.
static bool IsScriptLanguageSupported(lldb::ScriptLanguage language)
bool IsAlive() override
Check if a process is still alive.
Status DoAttach(const ProcessAttachInfo &attach_info)
bool GetProcessInfo(ProcessInstanceInfo &info) override
lldb_private::StructuredData::ObjectSP GetLoadedDynamicLibrariesInfos(lldb::BinaryInformationLevel info_level) override
Retrieve a StructuredData dictionary about all of the binaries loaded in the process at this time.
void DidResume() override
Called after resuming a process.
Status DoLaunch(Module *exe_module, ProcessLaunchInfo &launch_info) override
Launch a new process.
size_t DoWriteMemory(lldb::addr_t vm_addr, const void *buf, size_t size, Status &error) override
Actually do the writing of memory to a process.
Status DoResume(lldb::RunDirection direction) override
Resumes all of a process's threads as configured using the Thread run control functions.
ScriptedProcess(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp, const ScriptedMetadata &scripted_metadata, Status &error)
lldb::ScriptedProcessInterfaceUP m_interface_up
llvm::StringRef GetPluginName() override
Status EnableBreakpointSite(BreakpointSite *bp_site) override
lldb_private::StructuredData::DictionarySP GetMetadata() override
Fetch process defined metadata.
Status DoAttachToProcessWithName(const char *process_name, const ProcessAttachInfo &attach_info) override
Attach to an existing process using a partial process name.
void RefreshStateAfterStop() override
Currently called as part of ShouldStop.
static lldb::ProcessSP CreateInstance(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp, const FileSpec *crash_file_path, bool can_connect)
static llvm::StringRef GetPluginDescriptionStatic()
ScriptedProcessInterface & GetInterface() const
void DidLaunch() override
Called after launching a process.
Status DoGetMemoryRegionInfo(lldb::addr_t load_addr, MemoryRegionInfo &range_info) override
DoGetMemoryRegionInfo is called by GetMemoryRegionInfo after it has removed non address bits from loa...
static llvm::Expected< std::shared_ptr< ScriptedThread > > Create(ScriptedProcess &process, StructuredData::Generic *script_object=nullptr)
An error handling class.
Definition Status.h:118
static Status FromErrorStringWithFormat(const char *format,...) __attribute__((format(printf
Definition Status.cpp:106
static Status FromErrorString(const char *str)
Definition Status.h:141
static Status static Status FromErrorStringWithFormatv(const char *format, Args &&...args)
Definition Status.h:151
virtual lldb::addr_t GetLoadAddress() const
bool GetValueForKeyAsInteger(llvm::StringRef key, IntType &result) const
bool GetValueForKeyAsString(llvm::StringRef key, llvm::StringRef &result) const
bool HasKey(llvm::StringRef key) const
std::shared_ptr< Generic > GenericSP
std::shared_ptr< Dictionary > DictionarySP
std::shared_ptr< Object > ObjectSP
std::shared_ptr< Array > ArraySP
const ProcessLaunchInfo & GetProcessLaunchInfo() const
Definition Target.cpp:5182
void ModulesDidLoad(ModuleList &module_list)
This call may preload module symbols, and may do so in parallel depending on the following target set...
Definition Target.cpp:1841
lldb::ModuleSP GetOrCreateModule(const ModuleSpec &module_spec, bool notify, Status *error_ptr=nullptr)
Find a binary on the system and return its Module, or return an existing Module that is already in th...
Definition Target.cpp:2338
lldb::ModuleSP GetExecutableModule()
Gets the module for the main executable.
Definition Target.cpp:1525
const ModuleList & GetImages() const
Get accessor for the images for this process.
Definition Target.h:1157
const ArchSpec & GetArchitecture() const
Definition Target.h:1199
void AddThread(const lldb::ThreadSP &thread_sp)
uint32_t GetSize(bool can_update=true)
bool SetFromStringRef(llvm::StringRef str)
Definition UUID.cpp:101
#define LLDB_INVALID_ADDRESS
#define LLDB_INVALID_OFFSET
A class that represents a running process on the host machine.
Log * GetLog(Cat mask)
Retrieve the Log object for the channel associated with the given log enum.
Definition Log.h:327
std::string toString(FormatterBytecode::OpCodes op)
ScriptLanguage
Script interpreter types.
@ eScriptLanguagePython
std::shared_ptr< lldb_private::Queue > QueueSP
RunDirection
Execution directions.
std::shared_ptr< lldb_private::Thread > ThreadSP
uint64_t offset_t
Definition lldb-types.h:85
@ eStateStopped
Process or thread is stopped and can be examined.
@ eStateRunning
Process or thread is running and can't be examined.
std::shared_ptr< lldb_private::Process > ProcessSP
uint64_t pid_t
Definition lldb-types.h:83
std::shared_ptr< lldb_private::Listener > ListenerSP
uint64_t addr_t
Definition lldb-types.h:80
BinaryInformationLevel
When the Process plugin can retrieve information about all binaries loaded in the target process,...
std::shared_ptr< lldb_private::Target > TargetSP
@ eStructuredDataTypeGeneric
std::shared_ptr< lldb_private::RegisterContext > RegisterContextSP
std::shared_ptr< lldb_private::DataExtractor > DataExtractorSP
std::shared_ptr< lldb_private::Module > ModuleSP