Index: lldb/source/Plugins/Process/FreeBSDRemote/NativeThreadFreeBSD.h =================================================================== --- lldb/source/Plugins/Process/FreeBSDRemote/NativeThreadFreeBSD.h +++ lldb/source/Plugins/Process/FreeBSDRemote/NativeThreadFreeBSD.h @@ -74,6 +74,7 @@ using WatchpointIndexMap = std::map; WatchpointIndexMap m_watchpoint_index_map; WatchpointIndexMap m_hw_break_index_map; + llvm::Optional m_thread_name; }; typedef std::shared_ptr NativeThreadFreeBSDSP; Index: lldb/source/Plugins/Process/FreeBSDRemote/NativeThreadFreeBSD.cpp =================================================================== --- lldb/source/Plugins/Process/FreeBSDRemote/NativeThreadFreeBSD.cpp +++ lldb/source/Plugins/Process/FreeBSDRemote/NativeThreadFreeBSD.cpp @@ -22,9 +22,11 @@ #include #include #include +#include // clang-format on #include +#include using namespace lldb; using namespace lldb_private; @@ -146,7 +148,44 @@ m_stop_info.reason = StopReason::eStopReasonNone; } -std::string NativeThreadFreeBSD::GetName() { return ""; } +std::string NativeThreadFreeBSD::GetName() { + if (!m_thread_name) { + Log *log(ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_THREAD)); + + std::vector kp; + int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PID | KERN_PROC_INC_THREAD, + static_cast(GetProcess().GetID())}; + + while (1) { + size_t len = kp.size() * sizeof(struct kinfo_proc); + void *ptr = len == 0 ? nullptr : kp.data(); + int error = ::sysctl(mib, 4, ptr, &len, nullptr, 0); + if (ptr == nullptr || (error != 0 && errno == ENOMEM)) { + // Add extra space in case threads are added before next call. + kp.resize((len / sizeof(struct kinfo_proc)) + 10); + continue; + } + if (error != 0) { + len = 0; + LLDB_LOG(log, "tid = {0} in state {1} failed to get thread name: {2}", GetID(), + StateAsCString(m_state), strerror(errno)); + } + kp.resize(len / sizeof(struct kinfo_proc)); + break; + } + + // empty == unknown + m_thread_name = std::string(); + for (auto& procinfo : kp) { + if (procinfo.ki_tid == (lwpid_t)GetID()) { + m_thread_name = procinfo.ki_tdname; + break; + } + } + } + + return m_thread_name.getValue(); +} lldb::StateType NativeThreadFreeBSD::GetState() { return m_state; }