[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