[Lldb-commits] [lldb] r187545 - Fix thread name updating in Linux. "thread list" should report correct names always now.

Thirumurthi, Ashok ashok.thirumurthi at intel.com
Thu Aug 1 08:05:41 PDT 2013


FYI Mike,

I'm guessing that one of the "thread list" commits introduced a minor regression on both buildbots:
  http://lab.llvm.org:8011/builders/lldb-x86_64-debian-clang/builds/5774/steps/test%20lldb/logs/stdio
  http://lab.llvm.org:8011/builders/lldb-x86_64-linux/builds/5859/steps/test%20lldb/logs/stdio


FAIL: LLDB (clang-x86_64) :: test_with_dwarf (TestLogging.LogTestCase)
======================================================================
FAIL: test_with_dwarf (TestLogging.LogTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/llvmbb/llvm-build-dir/lldb-x86_64-clang/llvm/tools/lldb/test/lldbtest.py", line 370, in wrapper
    return func(self, *args, **kwargs)
  File "/home/llvmbb/llvm-build-dir/lldb-x86_64-clang/llvm/tools/lldb/test/logging/TestLogging.py", line 23, in test_with_dwarf
    self.command_log_tests ("dwarf")
  File "/home/llvmbb/llvm-build-dir/lldb-x86_64-clang/llvm/tools/lldb/test/logging/TestLogging.py", line 90, in command_log_tests
    self.fail (err_msg)
AssertionError: Expected 'Processing command: command alias bp breakpoint
'; Found ' Processing command: command alias bp breakpoint
'
Config=x86_64-clang

- Ashok

-----Original Message-----
From: lldb-commits-bounces at cs.uiuc.edu [mailto:lldb-commits-bounces at cs.uiuc.edu] On Behalf Of Michael Sartain
Sent: Wednesday, July 31, 2013 7:28 PM
To: lldb-commits at cs.uiuc.edu
Subject: [Lldb-commits] [lldb] r187545 - Fix thread name updating in Linux. "thread list" should report correct names always now.

Author: mikesart
Date: Wed Jul 31 18:27:46 2013
New Revision: 187545

URL: http://llvm.org/viewvc/llvm-project?rev=187545&view=rev
Log:
Fix thread name updating in Linux. "thread list" should report correct names always now.
Created new LinuxThread class inherited from POSIXThread and removed linux / freebsd ifdefs Removed several un-needed set thread name calls

CR (and multiple suggestions): mkopec


Added:
    lldb/trunk/source/Plugins/Process/Linux/LinuxThread.cpp
    lldb/trunk/source/Plugins/Process/Linux/LinuxThread.h
Modified:
    lldb/trunk/source/Plugins/Process/FreeBSD/ProcessMonitor.cpp
    lldb/trunk/source/Plugins/Process/Linux/CMakeLists.txt
    lldb/trunk/source/Plugins/Process/Linux/ProcessLinux.cpp
    lldb/trunk/source/Plugins/Process/Linux/ProcessLinux.h
    lldb/trunk/source/Plugins/Process/Linux/ProcessMonitor.cpp
    lldb/trunk/source/Plugins/Process/POSIX/POSIXThread.cpp
    lldb/trunk/source/Plugins/Process/POSIX/POSIXThread.h
    lldb/trunk/source/Plugins/Process/POSIX/ProcessPOSIX.cpp
    lldb/trunk/source/Plugins/Process/POSIX/ProcessPOSIX.h
    lldb/trunk/source/Target/TargetList.cpp

Modified: lldb/trunk/source/Plugins/Process/FreeBSD/ProcessMonitor.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/FreeBSD/ProcessMonitor.cpp?rev=187545&r1=187544&r2=187545&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/FreeBSD/ProcessMonitor.cpp (original)
+++ lldb/trunk/source/Plugins/Process/FreeBSD/ProcessMonitor.cpp Wed Jul 
+++ 31 18:27:46 2013
@@ -1003,7 +1003,7 @@ ProcessMonitor::Launch(LaunchArgs *args)
         goto FINISH;
 
     // Update the process thread list with this new thread.
-    inferior.reset(new POSIXThread(*processSP, pid));
+    inferior.reset(process.CreateNewPOSIXThread(*processSP, pid));
     if (log)
         log->Printf ("ProcessMonitor::%s() adding pid = %" PRIu64, __FUNCTION__, pid);
     process.GetThreadList().AddThread(inferior);
@@ -1085,7 +1085,7 @@ ProcessMonitor::Attach(AttachArgs *args)
     }
 
     // Update the process thread list with the attached thread.
-    inferior.reset(new POSIXThread(*processSP, pid));
+    inferior.reset(process.CreateNewPOSIXThread(*processSP, pid));
     tl.AddThread(inferior);
 
     // Let our process instance know the thread has stopped.

Modified: lldb/trunk/source/Plugins/Process/Linux/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Linux/CMakeLists.txt?rev=187545&r1=187544&r2=187545&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/Linux/CMakeLists.txt (original)
+++ lldb/trunk/source/Plugins/Process/Linux/CMakeLists.txt Wed Jul 31 
+++ 18:27:46 2013
@@ -7,5 +7,6 @@ add_lldb_library(lldbPluginProcessLinux
   ProcessLinux.cpp
   ProcessMonitor.cpp
   LinuxSignals.cpp
+  LinuxThread.cpp
   )
 

Added: lldb/trunk/source/Plugins/Process/Linux/LinuxThread.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Linux/LinuxThread.cpp?rev=187545&view=auto
==============================================================================
--- lldb/trunk/source/Plugins/Process/Linux/LinuxThread.cpp (added)
+++ lldb/trunk/source/Plugins/Process/Linux/LinuxThread.cpp Wed Jul 31 
+++ 18:27:46 2013
@@ -0,0 +1,63 @@
+//===-- LinuxThread.cpp -----------------------------------------*- C++ 
+-*-===// //
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open 
+Source // License. See LICENSE.TXT for details.
+//
+//===------------------------------------------------------------------
+----===//
+
+// C Includes
+// C++ Includes
+// Other libraries and framework includes // Project includes #include 
+"LinuxThread.h"
+
+using namespace lldb;
+using namespace lldb_private;
+
+//---------------------------------------------------------------------
+---------
+// Constructors and destructors.
+
+LinuxThread::LinuxThread(Process &process, lldb::tid_t tid)
+    : POSIXThread(process, tid)
+{
+}
+
+LinuxThread::~LinuxThread()
+{
+}
+
+//---------------------------------------------------------------------
+---------
+// ProcessInterface protocol.
+
+void
+LinuxThread::RefreshStateAfterStop()
+{
+    // Invalidate the thread names every time we get a stop event on Linux so we
+    // will re-read the procfs comm virtual file when folks ask for the thread name.
+    m_thread_name_valid = false;
+
+    POSIXThread::RefreshStateAfterStop();
+}
+
+void
+LinuxThread::TraceNotify(const ProcessMessage &message) {
+    RegisterContextPOSIX* reg_ctx = GetRegisterContextPOSIX();
+    if (reg_ctx)
+    {
+        uint32_t num_hw_wps = reg_ctx->NumSupportedHardwareWatchpoints();
+        uint32_t wp_idx;
+        for (wp_idx = 0; wp_idx < num_hw_wps; wp_idx++)
+        {
+            if (reg_ctx->IsWatchpointHit(wp_idx))
+            {
+                WatchNotify(message);
+                return;
+            }
+        }
+    }
+    
+    POSIXThread::TraceNotify (message); }
\ No newline at end of file

Added: lldb/trunk/source/Plugins/Process/Linux/LinuxThread.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Linux/LinuxThread.h?rev=187545&view=auto
==============================================================================
--- lldb/trunk/source/Plugins/Process/Linux/LinuxThread.h (added)
+++ lldb/trunk/source/Plugins/Process/Linux/LinuxThread.h Wed Jul 31 18:27:46 2013
@@ -0,0 +1,43 @@
+//===-- LinuxThread.h -------------------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef liblldb_LinuxThread_H_
+#define liblldb_LinuxThread_H_
+
+// Other libraries and framework includes
+#include "POSIXThread.h"
+
+//------------------------------------------------------------------------------
+// @class LinuxThread
+// @brief Abstraction of a Linux thread.
+class LinuxThread
+    : public POSIXThread
+{
+public:
+
+    //------------------------------------------------------------------
+    // Constructors and destructors
+    //------------------------------------------------------------------
+    LinuxThread(lldb_private::Process &process, lldb::tid_t tid);
+
+    virtual ~LinuxThread();
+
+    //--------------------------------------------------------------------------
+    // LinuxThread internal API.
+
+    // POSIXThread override
+    virtual void
+    RefreshStateAfterStop();
+
+protected:
+    virtual void
+    TraceNotify(const ProcessMessage &message);
+};
+
+#endif // #ifndef liblldb_LinuxThread_H_

Modified: lldb/trunk/source/Plugins/Process/Linux/ProcessLinux.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Linux/ProcessLinux.cpp?rev=187545&r1=187544&r2=187545&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/Linux/ProcessLinux.cpp (original)
+++ lldb/trunk/source/Plugins/Process/Linux/ProcessLinux.cpp Wed Jul 31 18:27:46 2013
@@ -23,7 +23,7 @@
 #include "ProcessPOSIXLog.h"
 #include "Plugins/Process/Utility/InferiorCallPOSIX.h"
 #include "ProcessMonitor.h"
-#include "POSIXThread.h"
+#include "LinuxThread.h"
 
 using namespace lldb;
 using namespace lldb_private;
@@ -64,7 +64,7 @@ ProcessLinux::Initialize()
 // Constructors and destructors.
 
 ProcessLinux::ProcessLinux(Target& target, Listener &listener, FileSpec *core_file)
-    : ProcessPOSIX(target, listener), m_stopping_threads(false), m_core_file(core_file)
+    : ProcessPOSIX(target, listener), m_core_file(core_file), m_stopping_threads(false)
 {
 #if 0
     // FIXME: Putting this code in the ctor and saving the byte order in a
@@ -81,6 +81,7 @@ void
 ProcessLinux::Terminate()
 {
 }
+
 lldb_private::ConstString
 ProcessLinux::GetPluginNameStatic()
 {
@@ -171,6 +172,13 @@ ProcessLinux::StopAllThreads(lldb::tid_t
         log->Printf ("ProcessLinux::%s() finished", __FUNCTION__);
 }
 
+// ProcessPOSIX override
+POSIXThread *
+ProcessLinux::CreateNewPOSIXThread(lldb_private::Process &process, lldb::tid_t tid)
+{
+    return new LinuxThread(process, tid);
+}
+
 bool
 ProcessLinux::CanDebug(Target &target, bool plugin_specified_by_name)
 {

Modified: lldb/trunk/source/Plugins/Process/Linux/ProcessLinux.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Linux/ProcessLinux.h?rev=187545&r1=187544&r2=187545&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/Linux/ProcessLinux.h (original)
+++ lldb/trunk/source/Plugins/Process/Linux/ProcessLinux.h Wed Jul 31 18:27:46 2013
@@ -56,6 +56,7 @@ public:
 
     virtual bool
     UpdateThreadList(lldb_private::ThreadList &old_thread_list, lldb_private::ThreadList &new_thread_list);
+
     //------------------------------------------------------------------
     // PluginInterface protocol
     //------------------------------------------------------------------
@@ -94,6 +95,9 @@ public:
     virtual void
     StopAllThreads(lldb::tid_t stop_tid);
 
+    virtual POSIXThread *
+    CreateNewPOSIXThread(lldb_private::Process &process, lldb::tid_t tid);
+
 private:
 
     /// Linux-specific signal set.

Modified: lldb/trunk/source/Plugins/Process/Linux/ProcessMonitor.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Linux/ProcessMonitor.cpp?rev=187545&r1=187544&r2=187545&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/Linux/ProcessMonitor.cpp (original)
+++ lldb/trunk/source/Plugins/Process/Linux/ProcessMonitor.cpp Wed Jul 31 18:27:46 2013
@@ -1098,7 +1098,6 @@ ProcessMonitor::Launch(LaunchArgs *args)
     lldb::pid_t pid;
 
     lldb::ThreadSP inferior;
-    POSIXThread *thread;
     Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_PROCESS));
 
     // Propagate the environment if one is not supplied.
@@ -1232,10 +1231,7 @@ ProcessMonitor::Launch(LaunchArgs *args)
     // Update the process thread list with this new thread.
     // FIXME: should we be letting UpdateThreadList handle this?
     // FIXME: by using pids instead of tids, we can only support one thread.
-    inferior.reset(new POSIXThread(process, pid));
-
-    thread = static_cast<POSIXThread*>(inferior.get());
-    thread->SetName(Host::GetThreadName(pid, pid).c_str());
+    inferior.reset(process.CreateNewPOSIXThread(process, pid));
 
     if (log)
         log->Printf ("ProcessMonitor::%s() adding pid = %" PRIu64, __FUNCTION__, pid);
@@ -1297,7 +1293,6 @@ ProcessMonitor::Attach(AttachArgs *args)
     ProcessMonitor *monitor = args->m_monitor;
     ProcessLinux &process = monitor->GetProcess();
     lldb::ThreadSP inferior;
-    POSIXThread *thread;
     Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_PROCESS));
 
     // Use a map to keep track of the threads which we have attached/need to attach.
@@ -1362,10 +1357,7 @@ ProcessMonitor::Attach(AttachArgs *args)
                 }
 
                 // Update the process thread list with the attached thread.
-                inferior.reset(new POSIXThread(process, tid));
-
-                thread = static_cast<POSIXThread*>(inferior.get());
-                thread->SetName(Host::GetThreadName(pid, tid).c_str());
+                inferior.reset(process.CreateNewPOSIXThread(process, tid));
 
                 if (log)
                     log->Printf ("ProcessMonitor::%s() adding tid = %" PRIu64, __FUNCTION__, tid);

Modified: lldb/trunk/source/Plugins/Process/POSIX/POSIXThread.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/POSIX/POSIXThread.cpp?rev=187545&r1=187544&r2=187545&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/POSIX/POSIXThread.cpp (original)
+++ lldb/trunk/source/Plugins/Process/POSIX/POSIXThread.cpp Wed Jul 31 18:27:46 2013
@@ -45,6 +45,7 @@ POSIXThread::POSIXThread(Process &proces
     : Thread(process, tid),
       m_frame_ap (),
       m_breakpoint (),
+      m_thread_name_valid (false),
       m_thread_name ()
 {
     Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_THREAD));
@@ -111,7 +112,8 @@ POSIXThread::GetInfo()
 void
 POSIXThread::SetName (const char *name)
 {
-    if (name && name[0])
+    m_thread_name_valid = (name && name[0]);
+    if (m_thread_name_valid)
         m_thread_name.assign (name);
     else
         m_thread_name.clear();
@@ -120,6 +122,12 @@ POSIXThread::SetName (const char *name)
 const char *
 POSIXThread::GetName ()
 {
+    if (!m_thread_name_valid)
+    {
+        SetName(Host::GetThreadName(GetProcess()->GetID(), GetID()).c_str());
+        m_thread_name_valid = true;
+    }
+
     if (m_thread_name.empty())
         return NULL;
     return m_thread_name.c_str();
@@ -460,22 +468,6 @@ POSIXThread::WatchNotify(const ProcessMe
 void
 POSIXThread::TraceNotify(const ProcessMessage &message)
 {
-#ifndef __FreeBSD__
-    RegisterContextPOSIX* reg_ctx = GetRegisterContextPOSIX();
-    if (reg_ctx)
-    {
-        uint32_t num_hw_wps = reg_ctx->NumSupportedHardwareWatchpoints();
-        uint32_t wp_idx;
-        for (wp_idx = 0; wp_idx < num_hw_wps; wp_idx++)
-        {
-            if (reg_ctx->IsWatchpointHit(wp_idx))
-            {
-                WatchNotify(message);
-                return;
-            }
-        }
-    }
-#endif
     SetStopInfo (StopInfo::CreateStopReasonToTrace(*this));
 }
 

Modified: lldb/trunk/source/Plugins/Process/POSIX/POSIXThread.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/POSIX/POSIXThread.h?rev=187545&r1=187544&r2=187545&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/POSIX/POSIXThread.h (original)
+++ lldb/trunk/source/Plugins/Process/POSIX/POSIXThread.h Wed Jul 31 18:27:46 2013
@@ -91,7 +91,7 @@ public:
 
     uint32_t FindVacantWatchpointIndex();
 
-private:
+protected:
     RegisterContextPOSIX *
     GetRegisterContextPOSIX ()
     {
@@ -107,6 +107,7 @@ private:
 
     lldb::BreakpointSiteSP m_breakpoint;
 
+    bool m_thread_name_valid;
     std::string m_thread_name;
 
     ProcessMonitor &
@@ -117,7 +118,7 @@ private:
 
     void BreakNotify(const ProcessMessage &message);
     void WatchNotify(const ProcessMessage &message);
-    void TraceNotify(const ProcessMessage &message);
+    virtual void TraceNotify(const ProcessMessage &message);
     void LimboNotify(const ProcessMessage &message);
     void SignalNotify(const ProcessMessage &message);
     void SignalDeliveredNotify(const ProcessMessage &message);

Modified: lldb/trunk/source/Plugins/Process/POSIX/ProcessPOSIX.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/POSIX/ProcessPOSIX.cpp?rev=187545&r1=187544&r2=187545&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/POSIX/ProcessPOSIX.cpp (original)
+++ lldb/trunk/source/Plugins/Process/POSIX/ProcessPOSIX.cpp Wed Jul 31 18:27:46 2013
@@ -479,6 +479,12 @@ ProcessPOSIX::AddThreadForInitialStopIfN
     return added_to_set;
 }
 
+POSIXThread *
+ProcessPOSIX::CreateNewPOSIXThread(lldb_private::Process &process, lldb::tid_t tid)
+{
+    return new POSIXThread(process, tid);
+}
+
 void
 ProcessPOSIX::RefreshStateAfterStop()
 {
@@ -508,10 +514,7 @@ ProcessPOSIX::RefreshStateAfterStop()
                 log->Printf ("ProcessPOSIX::%s() adding thread, tid = %" PRIi64, __FUNCTION__, message.GetChildTID());
             lldb::tid_t child_tid = message.GetChildTID();
             ThreadSP thread_sp;
-            thread_sp.reset(new POSIXThread(*this, child_tid));
-
-            POSIXThread *thread = static_cast<POSIXThread*>(thread_sp.get());
-            thread->SetName(Host::GetThreadName(GetID(), child_tid).c_str());
+            thread_sp.reset(CreateNewPOSIXThread(*this, child_tid));
 
             Mutex::Locker lock(m_thread_list.GetMutex());
 
@@ -821,7 +824,7 @@ ProcessPOSIX::UpdateThreadList(ThreadLis
     assert(m_monitor);
     ThreadSP thread_sp (old_thread_list.FindThreadByID (GetID(), false));
     if (!thread_sp) {
-        thread_sp.reset(new POSIXThread(*this, GetID()));
+        thread_sp.reset(CreateNewPOSIXThread(*this, GetID()));
     }
 
     if (log && log->GetMask().Test(POSIX_LOG_VERBOSE))

Modified: lldb/trunk/source/Plugins/Process/POSIX/ProcessPOSIX.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/POSIX/ProcessPOSIX.h?rev=187545&r1=187544&r2=187545&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/POSIX/ProcessPOSIX.h (original)
+++ lldb/trunk/source/Plugins/Process/POSIX/ProcessPOSIX.h Wed Jul 31 18:27:46 2013
@@ -22,6 +22,7 @@
 #include "ProcessMessage.h"
 
 class ProcessMonitor;
+class POSIXThread;
 
 class ProcessPOSIX :
     public lldb_private::Process
@@ -166,6 +167,9 @@ public:
     bool
     AddThreadForInitialStopIfNeeded(lldb::tid_t stop_tid);
 
+    virtual POSIXThread *
+    CreateNewPOSIXThread(lldb_private::Process &process, lldb::tid_t tid);
+
 protected:
     /// Target byte order.
     lldb::ByteOrder m_byte_order;

Modified: lldb/trunk/source/Target/TargetList.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/TargetList.cpp?rev=187545&r1=187544&r2=187545&view=diff
==============================================================================
--- lldb/trunk/source/Target/TargetList.cpp (original)
+++ lldb/trunk/source/Target/TargetList.cpp Wed Jul 31 18:27:46 2013
@@ -222,8 +222,19 @@ TargetList::CreateTarget (Debugger &debu
     FileSpec file (user_exe_path, false);
     if (!file.Exists() && user_exe_path && user_exe_path[0] == '~')
     {
-        file = FileSpec(user_exe_path, true);
+        // we want to expand the tilde but we don't want to resolve any symbolic links
+        // so we can't use the FileSpec constructor's resolve flag
+        char unglobbed_path[PATH_MAX];
+        unglobbed_path[0] = '\0';
+
+        size_t return_count = FileSpec::ResolveUsername(user_exe_path, unglobbed_path, sizeof(unglobbed_path));
+
+        if (return_count == 0 || return_count >= sizeof(unglobbed_path))
+            ::snprintf (unglobbed_path, sizeof(unglobbed_path), "%s", user_exe_path);
+
+        file = FileSpec(unglobbed_path, false);
     }
+
     bool user_exe_path_is_bundle = false;
     char resolved_bundle_exe_path[PATH_MAX];
     resolved_bundle_exe_path[0] = '\0';
@@ -305,8 +316,8 @@ TargetList::CreateTarget (Debugger &debu
             }
             else
             {
-                // Just use what the user typed
-                target_sp->SetArg0 (user_exe_path);
+                // Use resolved path
+                target_sp->SetArg0 (file.GetPath().c_str());
             }
         }
         if (file.GetDirectory())


_______________________________________________
lldb-commits mailing list
lldb-commits at cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits




More information about the lldb-commits mailing list