31 "__lldb_backtrace_recording_get_item_info";
40 typedef unsigned int uint32_t; \n\
41 typedef unsigned long long uint64_t; \n\
42 typedef uint32_t mach_port_t; \n\
43 typedef mach_port_t vm_map_t; \n\
44 typedef int kern_return_t; \n\
45 typedef uint64_t mach_vm_address_t; \n\
46 typedef uint64_t mach_vm_size_t; \n\
48 mach_port_t mach_task_self (); \n\
49 kern_return_t mach_vm_deallocate (vm_map_t target, mach_vm_address_t address, mach_vm_size_t size); \n\
52 * libBacktraceRecording defines \n\
55 typedef uint32_t queue_list_scope_t; \n\
56 typedef void *dispatch_queue_t; \n\
57 typedef void *introspection_dispatch_queue_info_t; \n\
58 typedef void *introspection_dispatch_item_info_ref; \n\
60 extern uint64_t __introspection_dispatch_queue_item_get_info (introspection_dispatch_item_info_ref item_info_ref, \n\
61 introspection_dispatch_item_info_ref *returned_queues_buffer, \n\
62 uint64_t *returned_queues_buffer_size); \n\
63 extern int printf(const char *format, ...); \n\
66 * return type define \n\
69 struct get_item_info_return_values \n\
71 uint64_t item_info_buffer_ptr; /* the address of the items buffer from libBacktraceRecording */ \n\
72 uint64_t item_info_buffer_size; /* the size of the items buffer from libBacktraceRecording */ \n\
75 void __lldb_backtrace_recording_get_item_info \n\
76 (struct get_item_info_return_values *return_buffer, \n\
78 uint64_t /* introspection_dispatch_item_info_ref item_info_ref */ item, \n\
79 void *page_to_free, \n\
80 uint64_t page_to_free_size) \n\
83 printf (\"entering get_item_info with args return_buffer == %p, debug == %d, item == 0x%llx, page_to_free == %p, page_to_free_size == 0x%llx\\n\", return_buffer, debug, item, page_to_free, page_to_free_size); \n\
84 if (page_to_free != 0) \n\
86 mach_vm_deallocate (mach_task_self(), (mach_vm_address_t) page_to_free, (mach_vm_size_t) page_to_free_size); \n\
89 __introspection_dispatch_queue_item_get_info ((void*) item, \n\
90 (void**)&return_buffer->item_info_buffer_ptr, \n\
91 &return_buffer->item_info_buffer_size); \n\
97 : m_process(process), m_get_item_info_impl_code(),
98 m_get_item_info_function_mutex(),
100 m_get_item_info_retbuffer_mutex() {}
110 (void)lock.try_lock();
149 if (!utility_fn_or_error) {
151 "Failed to create utility function: {0}");
155 LLDB_LOGF(log,
"No get-item-info introspection code found.");
160 auto type_system_or_err =
161 thread.
GetProcess()->GetTarget().GetScratchTypeSystemForLanguage(
163 if (
auto err = type_system_or_err.takeError()) {
165 "Error inserting get-item-info function: {0}");
168 auto ts = *type_system_or_err;
178 get_item_info_return_type, get_item_info_arglist,
179 thread.shared_from_this(),
error);
180 if (
error.Fail() || get_item_info_caller ==
nullptr) {
181 LLDB_LOGF(log,
"Error inserting get-item-info function: \"%s\".",
188 if (!get_item_info_caller) {
189 LLDB_LOGF(log,
"Failed to get get-item-info introspection caller.");
204 exe_ctx, args_addr, get_item_info_arglist, diagnostics)) {
206 LLDB_LOGF(log,
"Error writing get-item-info function arguments.");
207 diagnostics.
Dump(log);
219 uint64_t page_to_free_size,
235 LLDB_LOGF(log,
"Not safe to call functions on thread 0x%" PRIx64,
237 error.SetErrorString(
"Not safe to call functions on this thread.");
265 Value return_buffer_ptr_value;
280 Value page_to_free_value;
284 Value page_to_free_size_value;
290 addr_t bufaddr = process_sp->AllocateMemory(
291 32, ePermissionsReadable | ePermissionsWritable,
error);
293 LLDB_LOGF(log,
"Failed to allocate memory for return buffer for get "
294 "current queues func call");
303 argument_values.
PushValue(return_buffer_ptr_value);
312 page_to_free_value.
GetScalar() = page_to_free;
315 argument_values.
PushValue(page_to_free_value);
317 page_to_free_size_value.
GetScalar() = page_to_free_size;
318 argument_values.
PushValue(page_to_free_size_value);
328#if __has_feature(address_sanitizer)
329 options.
SetTimeout(process_sp->GetUtilityExpressionTimeout());
331 options.
SetTimeout(std::chrono::milliseconds(500));
333 options.
SetTimeout(process_sp->GetUtilityExpressionTimeout());
339 error.SetErrorString(
"Unable to compile function to call "
340 "__introspection_dispatch_queue_item_get_info");
348 LLDB_LOGF(log,
"Could not retrieve function caller for "
349 "__introspection_dispatch_queue_item_get_info.");
350 error.SetErrorString(
"Could not retrieve function caller for "
351 "__introspection_dispatch_queue_item_get_info.");
355 func_call_ret = func_caller->
ExecuteFunction(exe_ctx, &args_addr, options,
356 diagnostics, results);
360 "__introspection_dispatch_queue_item_get_info(), got "
361 "ExpressionResults %d, error contains %s",
362 func_call_ret,
error.AsCString(
""));
363 error.SetErrorString(
"Unable to call "
364 "__introspection_dispatch_queue_get_item_info() for "
371 if (!
error.Success() ||
380 if (!
error.Success()) {
385 "AppleGetItemInfoHandler called "
386 "__introspection_dispatch_queue_item_get_info (page_to_free == "
387 "0x%" PRIx64
", size = %" PRId64
"), returned page is at 0x%" PRIx64
static llvm::raw_ostream & error(Stream &strm)
#define LLDB_LOGF(log,...)
#define LLDB_LOG_ERROR(log, error,...)
lldb_private::Process * m_process
std::mutex m_get_item_info_function_mutex
AppleGetItemInfoHandler(lldb_private::Process *process)
~AppleGetItemInfoHandler()
lldb::addr_t m_get_item_info_return_buffer_addr
GetItemInfoReturnInfo GetItemInfo(Thread &thread, lldb::addr_t item, lldb::addr_t page_to_free, uint64_t page_to_free_size, lldb_private::Status &error)
Get the information about a work item by calling __introspection_dispatch_queue_item_get_info.
std::mutex m_get_item_info_retbuffer_mutex
std::unique_ptr< UtilityFunction > m_get_item_info_impl_code
static const char * g_get_item_info_function_name
lldb::addr_t SetupGetItemInfoFunction(Thread &thread, ValueList &get_item_info_arglist)
static const char * g_get_item_info_function_code
Generic representation of a type in a programming language.
CompilerType GetBasicTypeFromAST(lldb::BasicType basic_type) const
Create related types using the current type's AST.
CompilerType GetPointerType() const
Return a new CompilerType that is a pointer to this type.
void SetUnwindOnError(bool unwind=false)
void SetTryAllThreads(bool try_others=true)
void SetTimeout(const Timeout< std::micro > &timeout)
void SetStopOthers(bool stop_others=true)
void SetIsForUtilityExpr(bool b)
void SetIgnoreBreakpoints(bool ignore=false)
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
Target & GetTargetRef() const
Returns a reference to the target object.
Encapsulates a function that can be called.
lldb::ExpressionResults ExecuteFunction(ExecutionContext &exe_ctx, lldb::addr_t *args_addr_ptr, const EvaluateExpressionOptions &options, DiagnosticManager &diagnostic_manager, Value &results)
Run the function this FunctionCaller was created with.
bool WriteFunctionArguments(ExecutionContext &exe_ctx, lldb::addr_t &args_addr_ref, DiagnosticManager &diagnostic_manager)
Insert the default function argument struct.
A plug-in interface definition class for debugging a process.
uint64_t ReadUnsignedIntegerFromMemory(lldb::addr_t load_addr, size_t byte_size, uint64_t fail_value, Status &error)
Reads an unsigned integer of the specified byte size from process memory.
virtual bool IsAlive()
Check if a process is still alive.
Status DeallocateMemory(lldb::addr_t ptr)
The public interface to deallocating memory in the process.
static lldb::TypeSystemClangSP GetForTarget(Target &target, std::optional< IsolatedASTKind > ast_kind=DefaultAST, bool create_on_demand=true)
Returns the scratch TypeSystemClang for the given target.
llvm::Expected< std::unique_ptr< UtilityFunction > > CreateUtilityFunction(std::string expression, std::string name, lldb::LanguageType language, ExecutionContext &exe_ctx)
Creates and installs a UtilityFunction for the given language.
virtual lldb::StackFrameSP GetStackFrameAtIndex(uint32_t idx)
virtual bool SafeToCallFunctions()
Check whether this thread is safe to run functions.
void CalculateExecutionContext(ExecutionContext &exe_ctx) override
Reconstruct the object's execution context into sc.
lldb::ProcessSP CalculateProcess() override
lldb::TargetSP CalculateTarget() override
lldb::ProcessSP GetProcess() const
void PushValue(const Value &value)
const Scalar & GetScalar() const
@ Scalar
A raw scalar value.
void SetCompilerType(const CompilerType &compiler_type)
void SetValueType(ValueType value_type)
#define LLDB_INVALID_ADDRESS
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.
std::shared_ptr< lldb_private::StackFrame > StackFrameSP
@ eBasicTypeUnsignedLongLong
@ eLanguageTypeC
Non-standardized C, such as K&R.
@ eLanguageTypeObjC
Objective-C.
ExpressionResults
The results of expression evaluation.
std::shared_ptr< lldb_private::Process > ProcessSP
std::shared_ptr< lldb_private::TypeSystemClang > TypeSystemClangSP
std::shared_ptr< lldb_private::Target > TargetSP
lldb::addr_t item_buffer_ptr
lldb::addr_t item_buffer_size
lldb::user_id_t GetID() const
Get accessor for the user ID.