17 #if LLDB_ENABLE_FBSDVMCORE
20 #if defined(__FreeBSD__)
31 #if LLDB_ENABLE_FBSDVMCORE
34 ProcessFreeBSDKernelFVC(lldb::TargetSP target_sp, lldb::ListenerSP listener,
37 ~ProcessFreeBSDKernelFVC();
39 size_t DoReadMemory(
lldb::addr_t addr,
void *buf,
size_t size,
45 const char *GetError();
47 #endif // LLDB_ENABLE_FBSDVMCORE
49 #if defined(__FreeBSD__)
52 ProcessFreeBSDKernelKVM(lldb::TargetSP target_sp, lldb::ListenerSP listener,
55 ~ProcessFreeBSDKernelKVM();
57 size_t DoReadMemory(
lldb::addr_t addr,
void *buf,
size_t size,
63 const char *GetError();
65 #endif // defined(__FreeBSD__)
70 ListenerSP listener_sp)
74 ListenerSP listener_sp,
77 ModuleSP executable = target_sp->GetExecutableModule();
78 if (crash_file && !can_connect && executable) {
79 #if LLDB_ENABLE_FBSDVMCORE
81 fvc_open(executable->GetFileSpec().GetPath().c_str(),
82 crash_file->
GetPath().c_str(),
nullptr,
nullptr,
nullptr);
84 return std::make_shared<ProcessFreeBSDKernelFVC>(target_sp, listener_sp,
88 #if defined(__FreeBSD__)
90 kvm_open2(executable->GetFileSpec().GetPath().c_str(),
91 crash_file->
GetPath().c_str(), O_RDONLY,
nullptr,
nullptr);
93 return std::make_shared<ProcessFreeBSDKernelKVM>(target_sp, listener_sp,
101 static llvm::once_flag g_once_flag;
103 llvm::call_once(g_once_flag, []() {
116 bool plugin_specified_by_name) {
124 if (old_thread_list.
GetSize(
false) == 0) {
131 switch (
GetTarget().GetArchitecture().GetMachine()) {
132 case llvm::Triple::aarch64:
133 case llvm::Triple::x86:
134 case llvm::Triple::x86_64:
146 int32_t offset_p_pid =
165 if (offset_p_list == -1 || offset_p_pid == -1 || offset_p_threads == -1 ||
166 offset_p_comm == -1 || offset_td_tid == -1 || offset_td_plist == -1 ||
167 offset_td_pcb == -1 || offset_td_oncpu == -1 || offset_td_name == -1)
183 constexpr
size_t fbsd_maxcomlen = 19;
195 char comm[fbsd_maxcomlen + 1];
212 char thread_name[fbsd_maxcomlen + 1];
214 sizeof(thread_name),
error);
220 std::string thread_desc = llvm::formatv(
"(pid {0}) {1}", pid, comm);
221 if (*thread_name && strcmp(thread_name, comm)) {
223 thread_desc += thread_name;
230 if (tid == dumptid) {
233 thread_desc +=
" (crashed)";
234 }
else if (oncpu != -1) {
238 pcb_addr = stoppcbs + oncpu * pcbsize;
241 thread_desc += llvm::formatv(
" (on CPU {0})", oncpu);
251 for (
uint32_t i = 0; i < num_threads; ++i)
254 return new_thread_list.
GetSize(
false) > 0;
264 m_dyld_up.reset(DynamicLoader::FindPlugin(
275 #if LLDB_ENABLE_FBSDVMCORE
277 ProcessFreeBSDKernelFVC::ProcessFreeBSDKernelFVC(lldb::TargetSP target_sp,
278 ListenerSP listener_sp,
282 ProcessFreeBSDKernelFVC::~ProcessFreeBSDKernelFVC() {
287 size_t ProcessFreeBSDKernelFVC::DoReadMemory(
lldb::addr_t addr,
void *buf,
290 rd = fvc_read(m_fvc, addr, buf, size);
291 if (rd < 0 ||
static_cast<size_t>(rd) != size) {
292 error.SetErrorStringWithFormat(
"Reading memory failed: %s", GetError());
293 return rd > 0 ? rd : 0;
298 const char *ProcessFreeBSDKernelFVC::GetError() {
return fvc_geterr(m_fvc); }
300 #endif // LLDB_ENABLE_FBSDVMCORE
302 #if defined(__FreeBSD__)
304 ProcessFreeBSDKernelKVM::ProcessFreeBSDKernelKVM(lldb::TargetSP target_sp,
305 ListenerSP listener_sp,
309 ProcessFreeBSDKernelKVM::~ProcessFreeBSDKernelKVM() {
314 size_t ProcessFreeBSDKernelKVM::DoReadMemory(
lldb::addr_t addr,
void *buf,
317 rd = kvm_read2(m_kvm, addr, buf, size);
318 if (rd < 0 ||
static_cast<size_t>(rd) != size) {
319 error.SetErrorStringWithFormat(
"Reading memory failed: %s", GetError());
320 return rd > 0 ? rd : 0;
325 const char *ProcessFreeBSDKernelKVM::GetError() {
return kvm_geterr(m_kvm); }
327 #endif // defined(__FreeBSD__)