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
30#include "llvm/Support/Error.h"
31
32#include <string>
33
34using namespace lldb;
35using namespace lldb_private;
36
38
40 return "Scripted Process plug-in.";
41}
42
46
48 llvm::ArrayRef<lldb::ScriptLanguage> supported_languages =
49 llvm::ArrayRef(g_supported_script_languages);
50
51 return llvm::is_contained(supported_languages, language);
52}
53
55 lldb::ListenerSP listener_sp,
56 const FileSpec *file,
57 bool can_connect) {
58 if (!target_sp ||
59 !IsScriptLanguageSupported(target_sp->GetDebugger().GetScriptLanguage()))
60 return nullptr;
61
62 ScriptedMetadata scripted_metadata(target_sp->GetProcessLaunchInfo());
63
64 if (!scripted_metadata)
65 return nullptr;
66
68 auto process_sp = std::shared_ptr<ScriptedProcess>(
69 new ScriptedProcess(target_sp, listener_sp, scripted_metadata, error));
70
71 if (error.Fail() || !process_sp || !process_sp->m_interface_up) {
72 // CreateInstance returns nullptr on failure with no Status output
73 // parameter, so we must report the error via the diagnostic system for
74 // users to see it.
75 if (error.Fail()) {
77 llvm::formatv("failed to create ScriptedProcess: {0}",
78 error.AsCString())
79 .str(),
80 target_sp->GetDebugger().GetID());
81 }
82 LLDB_LOGF(GetLog(LLDBLog::Process), "%s", error.AsCString());
83 return nullptr;
84 }
85
86 return process_sp;
87}
88
90 bool plugin_specified_by_name) {
91 return true;
92}
93
95 lldb::ListenerSP listener_sp,
96 const ScriptedMetadata &scripted_metadata,
98 : Process(target_sp, listener_sp), m_scripted_metadata(scripted_metadata) {
99
100 if (!target_sp) {
102 "ScriptedProcess::%s () - ERROR: %s", __FUNCTION__, "Invalid target");
103 return;
104 }
105
106 ScriptInterpreter *interpreter =
107 target_sp->GetDebugger().GetScriptInterpreter();
108
109 if (!interpreter) {
111 "ScriptedProcess::%s () - ERROR: %s", __FUNCTION__,
112 "Debugger has no Script Interpreter");
113 return;
114 }
115
116 // Create process instance interface
118 if (!m_interface_up) {
120 "ScriptedProcess::%s () - ERROR: %s", __FUNCTION__,
121 "Script interpreter couldn't create Scripted Process Interface");
122 return;
123 }
124
125 ExecutionContext exe_ctx(target_sp, /*get_process=*/false);
126
127 // Create process script object
128 auto obj_or_err =
130
131 if (!obj_or_err) {
132 std::string error_msg = llvm::toString(obj_or_err.takeError());
134 "failed to create script object: {0}", error_msg);
135 return;
136 }
137
138 StructuredData::GenericSP object_sp = *obj_or_err;
139
140 if (!object_sp || !object_sp->IsValid()) {
142 "ScriptedProcess::%s () - ERROR: %s", __FUNCTION__,
143 "Failed to create valid script object");
144 return;
145 }
146}
147
149 Clear();
150 // If the interface is not valid, we can't call Finalize(). When that happens
151 // it means that the Scripted Process instanciation failed and the
152 // CreateProcess function returns a nullptr, so no one besides this class
153 // should have access to that bogus process object.
154 if (!m_interface_up)
155 return;
156 // We need to call finalize on the process before destroying ourselves to
157 // make sure all of the broadcaster cleanup goes as planned. If we destruct
158 // this class, then Process::~Process() might have problems trying to fully
159 // destroy the broadcaster.
160 Finalize(true /* destructing */);
161}
162
167
171
174
175 return DoLaunch(nullptr, launch_info);
176}
177
179 ProcessLaunchInfo &launch_info) {
180 LLDB_LOGF(GetLog(LLDBLog::Process), "ScriptedProcess::%s launching process", __FUNCTION__);
181
182 /* MARK: This doesn't reflect how lldb actually launches a process.
183 In reality, it attaches to debugserver, then resume the process.
184 That's not true in all cases. If debugserver is remote, lldb
185 asks debugserver to launch the process for it. */
188 return error;
189}
190
192
194 // Update the PID again, in case the user provided a placeholder pid at launch
196}
197
199 LLDB_LOGF(GetLog(LLDBLog::Process), "ScriptedProcess::%s resuming process", __FUNCTION__);
200
201 if (direction == RunDirection::eRunForward)
202 return GetInterface().Resume();
203 // FIXME: Pipe reverse continue through Scripted Processes
205 "{0} does not support reverse execution of processes", GetPluginName());
206}
207
209 Status error = GetInterface().Attach(attach_info);
210 if (error.Fail()) {
212 "failed to attach to scripted process: {0}", error.AsCString());
213 return error;
214 }
217 // NOTE: We need to set the PID before finishing to attach otherwise we will
218 // hit an assert when calling the attach completion handler.
219 DidLaunch();
220
221 return {};
222}
223
224Status
226 const ProcessAttachInfo &attach_info) {
227 return DoAttach(attach_info);
228}
229
231 const char *process_name, const ProcessAttachInfo &attach_info) {
232 return DoAttach(attach_info);
233}
234
236 process_arch = GetArchitecture();
237}
238
240
242
243size_t ScriptedProcess::DoReadMemory(lldb::addr_t addr, void *buf, size_t size,
244 Status &error) {
245 lldb::DataExtractorSP data_extractor_sp =
247
248 if (!data_extractor_sp || !data_extractor_sp->HasData() || error.Fail()) {
249 if (error.Fail()) {
251 "Failed to read memory from scripted process at 0x{0:x-}: {1}", addr,
252 error.AsCString());
253 }
254 return 0;
255 }
256
257 offset_t bytes_copied = data_extractor_sp->CopyByteOrderedData(
258 0, data_extractor_sp->GetByteSize(), buf, size, GetByteOrder());
259
260 if (!bytes_copied || bytes_copied == LLDB_INVALID_OFFSET)
262 LLVM_PRETTY_FUNCTION, "Failed to copy read memory to buffer.", error);
263
264 // FIXME: We should use the diagnostic system to report a warning if the
265 // `bytes_copied` is different from `size`.
266
267 return bytes_copied;
268}
269
270size_t ScriptedProcess::DoWriteMemory(lldb::addr_t vm_addr, const void *buf,
271 size_t size, Status &error) {
272 lldb::DataExtractorSP data_extractor_sp = std::make_shared<DataExtractor>(
273 buf, size, GetByteOrder(), GetAddressByteSize());
274
275 if (!data_extractor_sp || !data_extractor_sp->HasData())
276 return 0;
277
278 lldb::offset_t bytes_written =
279 GetInterface().WriteMemoryAtAddress(vm_addr, data_extractor_sp, error);
280
281 if (!bytes_written || bytes_written == LLDB_INVALID_OFFSET) {
282 if (error.Fail()) {
284 "failed to write memory to scripted process at 0x{0:x-}: {1}",
285 vm_addr, error.AsCString());
286 }
288 LLVM_PRETTY_FUNCTION, "Failed to copy write buffer to memory.", error);
289 }
290
291 // FIXME: We should use the diagnostic system to report a warning if the
292 // `bytes_written` is different from `size`.
293
294 return bytes_written;
295}
296
298 assert(bp_site != nullptr);
299
300 if (IsBreakpointSitePhysicallyEnabled(*bp_site)) {
301 return {};
302 }
303
304 if (bp_site->HardwareRequired()) {
306 "Scripted Processes don't support hardware breakpoints");
307 }
308
311
312 return error;
313}
314
318
320 MemoryRegionInfo &region) {
322 if (auto region_or_err =
323 GetInterface().GetMemoryRegionContainingAddress(load_addr, error))
324 region = *region_or_err;
325
326 return error;
327}
328
331 lldb::addr_t address = 0;
332
333 while (auto region_or_err =
334 GetInterface().GetMemoryRegionContainingAddress(address, error)) {
335 if (error.Fail())
336 break;
337
338 MemoryRegionInfo &mem_region = *region_or_err;
339 auto range = mem_region.GetRange();
340 address += range.GetRangeBase() + range.GetByteSize();
341 region_list.push_back(mem_region);
342 }
343
344 return error;
345}
346
348
350 ThreadList &new_thread_list) {
351 // TODO: Implement
352 // This is supposed to get the current set of threads, if any of them are in
353 // old_thread_list then they get copied to new_thread_list, and then any
354 // actually new threads will get added to new_thread_list.
355 m_thread_plans.ClearThreadCache();
356
359
360 if (!thread_info_sp)
362 LLVM_PRETTY_FUNCTION,
363 "Couldn't fetch thread list from Scripted Process.", error);
364
365 // Because `StructuredData::Dictionary` uses a `std::map<ConstString,
366 // ObjectSP>` for storage, each item is sorted based on the key alphabetical
367 // order. Since `GetThreadsInfo` provides thread indices as the key element,
368 // thread info comes ordered alphabetically, instead of numerically, so we
369 // need to sort the thread indices before creating thread.
370
371 StructuredData::ArraySP keys = thread_info_sp->GetKeys();
372
373 std::map<size_t, StructuredData::ObjectSP> sorted_threads;
374 auto sort_keys = [&sorted_threads,
375 &thread_info_sp](StructuredData::Object *item) -> bool {
376 if (!item)
377 return false;
378
379 llvm::StringRef key = item->GetStringValue();
380 size_t idx = 0;
381
382 // Make sure the provided index is actually an integer
383 if (!llvm::to_integer(key, idx))
384 return false;
385
386 sorted_threads[idx] = thread_info_sp->GetValueForKey(key);
387 return true;
388 };
389
390 size_t thread_count = thread_info_sp->GetSize();
391
392 if (!keys->ForEach(sort_keys) || sorted_threads.size() != thread_count)
393 // Might be worth showing the unsorted thread list instead of return early.
395 LLVM_PRETTY_FUNCTION, "Couldn't sort thread list.", error);
396
397 auto create_scripted_thread =
398 [this, &error, &new_thread_list](
399 const std::pair<size_t, StructuredData::ObjectSP> pair) -> bool {
400 size_t idx = pair.first;
401 StructuredData::ObjectSP object_sp = pair.second;
402
403 if (!object_sp)
405 LLVM_PRETTY_FUNCTION, "Invalid thread info object", error);
406
407 auto thread_or_error =
408 ScriptedThread::Create(*this, object_sp->GetAsGeneric());
409
410 if (!thread_or_error) {
412 llvm::formatv("failed to create scripted thread ({0}): {1}", idx,
413 llvm::toString(thread_or_error.takeError()))
414 .str(),
415 GetTarget().GetDebugger().GetID());
416 return false;
417 }
418
419 ThreadSP thread_sp = thread_or_error.get();
420 lldbassert(thread_sp && "Couldn't initialize scripted thread.");
421
422 RegisterContextSP reg_ctx_sp = thread_sp->GetRegisterContext();
423 if (!reg_ctx_sp)
425 LLVM_PRETTY_FUNCTION,
426 llvm::Twine("Invalid Register Context for thread " + llvm::Twine(idx))
427 .str(),
428 error);
429
430 new_thread_list.AddThread(thread_sp);
431
432 return true;
433 };
434
435 llvm::for_each(sorted_threads, create_scripted_thread);
436
437 return new_thread_list.GetSize(false) > 0;
438}
439
441 // Let all threads recover from stopping and do any clean up based on the
442 // previous thread state (if any).
443 m_thread_list.RefreshStateAfterStop();
444}
445
447 info.Clear();
448 info.SetProcessID(GetID());
451 if (module_sp) {
452 const bool add_exe_file_as_first_arg = false;
453 info.SetExecutableFile(GetTarget().GetExecutableModule()->GetFileSpec(),
454 add_exe_file_as_first_arg);
455 }
456 return true;
457}
458
461 BinaryInformationLevel info_level) {
463 auto error_with_message = [&error](llvm::StringRef message) {
464 return ScriptedInterface::ErrorWithMessage<bool>(LLVM_PRETTY_FUNCTION,
465 message.data(), error);
466 };
467
469
470 if (!loaded_images_sp || !loaded_images_sp->GetSize())
472 LLVM_PRETTY_FUNCTION, "No loaded images.", error);
473
474 ModuleList module_list;
475 Target &target = GetTarget();
476
477 auto reload_image = [&target, &module_list, &error_with_message](
478 StructuredData::Object *obj) -> bool {
480
481 if (!dict)
482 return error_with_message("Couldn't cast image object into dictionary.");
483
484 ModuleSpec module_spec;
485
486 bool has_path = dict->HasKey("path");
487 bool has_uuid = dict->HasKey("uuid");
488 if (!has_path && !has_uuid)
489 return error_with_message("Dictionary should have key 'path' or 'uuid'");
490 if (!dict->HasKey("load_addr"))
491 return error_with_message("Dictionary is missing key 'load_addr'");
492
493 llvm::StringRef path = "";
494 if (has_path) {
495 dict->GetValueForKeyAsString("path", path);
496 module_spec.GetFileSpec().SetPath(path);
497 }
498
499 llvm::StringRef uuid = "";
500 if (has_uuid) {
501 dict->GetValueForKeyAsString("uuid", uuid);
502 module_spec.GetUUID().SetFromStringRef(uuid);
503 }
504
507 dict->GetValueForKeyAsInteger("load_addr", load_addr);
508 dict->GetValueForKeyAsInteger("slide", slide);
509 if (load_addr == LLDB_INVALID_ADDRESS)
510 return error_with_message(
511 "Couldn't get valid load address or slide offset.");
512
513 if (slide != LLDB_INVALID_OFFSET)
514 load_addr += slide;
515
516 module_spec.GetArchitecture() = target.GetArchitecture();
517
518 ModuleSP module_sp =
519 target.GetOrCreateModule(module_spec, true /* notify */);
520
521 bool is_placeholder_module = false;
522
523 if (!module_sp) {
524 // Create a placeholder module
525 LLDB_LOGF(
527 "ScriptedProcess::%s unable to locate the matching "
528 "object file path %s, creating a placeholder module at 0x%" PRIx64,
529 __FUNCTION__, path.str().c_str(), load_addr);
530
532 module_spec, load_addr, module_spec.GetFileSpec().MemorySize());
533
534 is_placeholder_module = true;
535 }
536
537 bool changed = false;
538 module_sp->SetLoadAddress(target, load_addr, false /*=value_is_offset*/,
539 changed);
540
541 if (!changed && !module_sp->GetObjectFile())
542 return error_with_message("Couldn't set the load address for module.");
543
544 FileSpec objfile(path);
545 module_sp->SetFileSpecAndObjectName(objfile,
546 ConstString(objfile.GetFilename()));
547
548 if (is_placeholder_module) {
549 target.GetImages().AppendIfNeeded(module_sp, true /*notify=*/);
550 return true;
551 }
552
553 return module_list.AppendIfNeeded(module_sp);
554 };
555
556 size_t loaded_images_size = loaded_images_sp->GetSize();
557 bool print_error = true;
558 for (size_t idx = 0; idx < loaded_images_size; idx++) {
559 const auto &loaded_image = loaded_images_sp->GetItemAtIndex(idx);
560 if (!reload_image(loaded_image.get()) && print_error) {
561 print_error = false;
563 LLVM_PRETTY_FUNCTION, "Couldn't reload all images.", error);
564 }
565 }
566
567 target.ModulesDidLoad(module_list);
568
569 return loaded_images_sp;
570}
571
574
576 if (!metadata_sp || !metadata_sp->GetSize())
578 LLVM_PRETTY_FUNCTION, "No metadata.", error);
579
580 return metadata_sp;
581}
582
585 for (ThreadSP thread_sp : Threads()) {
586 if (const char *queue_name = thread_sp->GetQueueName()) {
587 QueueSP queue_sp = std::make_shared<Queue>(
588 m_process->shared_from_this(), thread_sp->GetQueueID(), queue_name);
589 m_queue_list.AddQueue(queue_sp);
590 }
591 }
592}
593
598
600 StructuredData::GenericSP object_instance_sp =
602 if (object_instance_sp &&
603 object_instance_sp->GetType() == eStructuredDataTypeGeneric)
604 return object_instance_sp->GetAsGeneric()->GetValue();
605 return nullptr;
606}
static llvm::raw_ostream & error(Stream &strm)
#define lldbassert(x)
Definition LLDBAssert.h:16
#define LLDB_LOGF(log,...)
Definition Log.h:389
#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.
A uniqued constant string class.
Definition ConstString.h:40
static void ReportError(std::string message, std::optional< lldb::user_id_t > debugger_id=std::nullopt, std::once_flag *once=nullptr)
Report error events.
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
A file utility class.
Definition FileSpec.h:57
void SetPath(llvm::StringRef p)
Temporary helper for FileSystem change.
Definition FileSpec.h:287
llvm::StringRef GetFilename() const
Filename string const get accessor.
Definition FileSpec.h:249
size_t MemorySize() const
Get the memory cost of this object.
Definition FileSpec.cpp:418
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:91
static lldb::ModuleSP CreateModuleFromObjectFile(Args &&...args)
Definition Module.h:136
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:64
void SetProcessID(lldb::pid_t pid)
Definition ProcessInfo.h:68
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:543
Process(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp)
Construct with a shared pointer to a target, and the Process listener.
Definition Process.cpp:453
QueueList m_queue_list
The list of libdispatch queues at a given stop point.
Definition Process.h:3523
bool IsBreakpointSitePhysicallyEnabled(const BreakpointSite &site)
Definition Process.cpp:1676
lldb::ByteOrder GetByteOrder() const
Definition Process.cpp:3926
ThreadList::ThreadIterable Threads()
Definition Process.h:2407
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:3512
friend class Target
Definition Process.h:365
uint32_t GetAddressByteSize() const
Definition Process.cpp:3930
void SetPrivateState(lldb::StateType state)
Definition Process.cpp:1411
virtual void Finalize(bool destructing)
This object is about to be destroyed, do any necessary cleanup.
Definition Process.cpp:564
ThreadList m_thread_list
The threads for this process as the user will see them.
Definition Process.h:3508
lldb::pid_t m_pid
Definition Process.h:3476
friend class ThreadList
Definition Process.h:366
Target & GetTarget()
Get the target object pointer for this module.
Definition Process.h:1258
virtual lldb::ScriptedProcessInterfaceUP CreateScriptedProcessInterface()
static Ret ErrorWithMessage(llvm::StringRef caller_name, llvm::StringRef user_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(const ScriptedMetadata &scripted_metadata, ExecutionContext &exe_ctx, 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:5795
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:1940
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:2439
lldb::ModuleSP GetExecutableModule()
Gets the module for the main executable.
Definition Target.cpp:1624
const ModuleList & GetImages() const
Get accessor for the images for this process.
Definition Target.h:1247
const ArchSpec & GetArchitecture() const
Definition Target.h:1289
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:338
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