[Lldb-commits] [PATCH] elf-core: Parse thread names on FreeBSD
Ed Maste
emaste at freebsd.org
Thu Jul 18 07:43:15 PDT 2013
On FreeBSD we store thread names in NT_THRMISC notes.
---
source/Plugins/Process/elf-core/ProcessElfCore.cpp | 9 ++++--
source/Plugins/Process/elf-core/ProcessElfCore.h | 1 +
source/Plugins/Process/elf-core/ThreadElfCore.cpp | 33 ++++++++++++++++++++--
source/Plugins/Process/elf-core/ThreadElfCore.h | 28 +++++++++++++++++-
4 files changed, 66 insertions(+), 5 deletions(-)
diff --git a/source/Plugins/Process/elf-core/ProcessElfCore.cpp b/source/Plugins/Process/elf-core/ProcessElfCore.cpp
index 461501e..16b52ec 100644
--- a/source/Plugins/Process/elf-core/ProcessElfCore.cpp
+++ b/source/Plugins/Process/elf-core/ProcessElfCore.cpp
@@ -246,7 +246,8 @@ ProcessElfCore::UpdateThreadList (ThreadList &old_thread_list, ThreadList &new_t
{
const ThreadData &td = m_thread_data[tid];
lldb::ThreadSP thread_sp(new ThreadElfCore (*this, tid, td.prstatus,
- td.prpsinfo, td.fpregset));
+ td.prpsinfo, td.fpregset,
+ td.thrmisc));
new_thread_list.AddThread (thread_sp);
}
return new_thread_list.GetSize(false) > 0;
@@ -367,7 +368,8 @@ enum {
NT_PRPSINFO,
NT_TASKSTRUCT,
NT_PLATFORM,
- NT_AUXV
+ NT_AUXV,
+ NT_THRMISC
};
/// Note Structure found in ELF core dumps.
@@ -480,6 +482,9 @@ ProcessElfCore::ParseThreadContextsFromNoteSegment(const elf::ELFProgramHeader *
case NT_AUXV:
m_auxv = DataExtractor(note_data);
break;
+ case NT_THRMISC:
+ thread_data->thrmisc = note_data;
+ break;
default:
break;
}
diff --git a/source/Plugins/Process/elf-core/ProcessElfCore.h b/source/Plugins/Process/elf-core/ProcessElfCore.h
index 34ac05c..2bbbeb9 100644
--- a/source/Plugins/Process/elf-core/ProcessElfCore.h
+++ b/source/Plugins/Process/elf-core/ProcessElfCore.h
@@ -142,6 +142,7 @@ private:
lldb_private::DataExtractor prstatus;
lldb_private::DataExtractor fpregset;
lldb_private::DataExtractor prpsinfo;
+ lldb_private::DataExtractor thrmisc;
};
lldb::ModuleSP m_core_module_sp;
diff --git a/source/Plugins/Process/elf-core/ThreadElfCore.cpp b/source/Plugins/Process/elf-core/ThreadElfCore.cpp
index 6ac12fe..ad8c34e 100644
--- a/source/Plugins/Process/elf-core/ThreadElfCore.cpp
+++ b/source/Plugins/Process/elf-core/ThreadElfCore.cpp
@@ -26,7 +26,8 @@ using namespace lldb_private;
// Construct a Thread object with given PRSTATUS, PRPSINFO and FPREGSET
//----------------------------------------------------------------------
ThreadElfCore::ThreadElfCore (Process &process, tid_t tid, DataExtractor prstatus,
- DataExtractor prpsinfo, DataExtractor fpregset) :
+ DataExtractor prpsinfo, DataExtractor fpregset,
+ DataExtractor thrmisc) :
Thread(process, tid),
m_thread_reg_ctx_sp ()
{
@@ -36,11 +37,16 @@ ThreadElfCore::ThreadElfCore (Process &process, tid_t tid, DataExtractor prstatu
/* Parse the datastructures from the file */
m_prstatus.Parse(prstatus, arch);
m_prpsinfo.Parse(prpsinfo, arch);
+ m_thrmisc.Parse(thrmisc, arch);
m_prstatus_data = prstatus;
m_fpregset_data = fpregset;
- m_thread_name = std::string(m_prpsinfo.pr_fname);
+ if (m_thrmisc.pr_tname[0]) {
+ m_thread_name = std::string(m_thrmisc.pr_tname);
+ } else {
+ m_thread_name = std::string(m_prpsinfo.pr_fname);
+ }
}
ThreadElfCore::~ThreadElfCore ()
@@ -173,3 +179,26 @@ ELFPrPsInfo::Parse(DataExtractor &data, ArchSpec &arch)
}
}
+//----------------------------------------------------------------
+// Parse THRMISC from NOTE entry
+//----------------------------------------------------------------
+ELFThrMisc::ELFThrMisc()
+{
+ memset(this, 0, sizeof(ELFThrMisc));
+}
+
+bool
+ELFThrMisc::Parse(DataExtractor &data, ArchSpec &arch)
+{
+ ByteOrder byteorder = data.GetByteOrder();
+ size_t len;
+ switch(arch.GetCore())
+ {
+ case ArchSpec::eCore_x86_64_x86_64:
+ len = data.ExtractBytes(0, ELFTHRMISC64_SIZE, byteorder, this);
+ return len == ELFTHRMISC64_SIZE;
+ default:
+ return false;
+ }
+}
+
diff --git a/source/Plugins/Process/elf-core/ThreadElfCore.h b/source/Plugins/Process/elf-core/ThreadElfCore.h
index ad0f67a..5b01ed5 100644
--- a/source/Plugins/Process/elf-core/ThreadElfCore.h
+++ b/source/Plugins/Process/elf-core/ThreadElfCore.h
@@ -33,6 +33,7 @@ struct compat_timeval
#define ELFPRSTATUS64_SIZE (112)
#define ELFPRPSINFO64_SIZE (132)
#endif
+#define ELFTHRMISC64_SIZE (24)
struct ELFPrStatus
{
@@ -125,13 +126,37 @@ struct ELFPrPsInfo
};
+struct ELFThrMisc
+{
+ char pr_tname[20];
+ uint32_t _pad;
+
+ ELFThrMisc();
+
+ bool
+ Parse(lldb_private::DataExtractor &data, lldb_private::ArchSpec &arch);
+
+ static size_t
+ GetSize(lldb_private::ArchSpec &arch)
+ {
+ switch(arch.GetCore())
+ {
+ case lldb_private::ArchSpec::eCore_x86_64_x86_64:
+ return ELFTHRMISC64_SIZE;
+ default:
+ return 0;
+ }
+ }
+};
+
class ThreadElfCore : public lldb_private::Thread
{
public:
ThreadElfCore (lldb_private::Process &process, lldb::tid_t tid,
lldb_private::DataExtractor prstatus,
lldb_private::DataExtractor prpsinfo,
- lldb_private::DataExtractor fpregset);
+ lldb_private::DataExtractor fpregset,
+ lldb_private::DataExtractor thrmisc);
virtual
~ThreadElfCore ();
@@ -180,6 +205,7 @@ protected:
ELFPrStatus m_prstatus;
ELFPrPsInfo m_prpsinfo;
+ ELFThrMisc m_thrmisc;
lldb_private::DataExtractor m_prstatus_data;
lldb_private::DataExtractor m_fpregset_data;
--
1.7.11.5
More information about the lldb-commits
mailing list