Last active
December 17, 2015 04:29
-
-
Save mikesartain/5550857 to your computer and use it in GitHub Desktop.
lldb patch for Linux Host::SetThreadName
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Index: source/Host/linux/Host.cpp | |
=================================================================== | |
--- source/Host/linux/Host.cpp (revision 181496) | |
+++ source/Host/linux/Host.cpp (working copy) | |
@@ -169,4 +169,51 @@ | |
// FIXME: Parse /proc/<pid>/status to get uid, gid, euid, egid and parent_pid | |
return true; | |
-} | |
\ No newline at end of file | |
+} | |
+ | |
+void | |
+Host::ThreadCreated (const char *thread_name) | |
+{ | |
+ if (!Host::SetThreadName (LLDB_INVALID_PROCESS_ID, LLDB_INVALID_THREAD_ID, thread_name)) | |
+ { | |
+ // pthread_setname_np_func can fail if the thread name is longer than | |
+ // the supported limit on Linux. When this occurs, the error ERANGE is returned | |
+ // and SetThreadName will fail. Let's drop it down to 16 characters and try again. | |
+ char namebuf[16]; | |
+ | |
+ // Thread names are coming in like '<lldb.comm.debugger.edit>' and '<lldb.comm.debugger.editline>' | |
+ // So just chopping the end of the string off leads to a lot of similar named threads. | |
+ // Go through the thread name and search for the last dot and use that. | |
+ const char *lastdot = ::strrchr( thread_name, '.' ); | |
+ | |
+ if (lastdot && lastdot != thread_name) | |
+ thread_name = lastdot + 1; | |
+ ::strncpy (namebuf, thread_name, sizeof(namebuf)); | |
+ namebuf[ sizeof(namebuf) - 1 ] = 0; | |
+ | |
+ int namebuflen = strlen(namebuf); | |
+ if (namebuflen > 0) | |
+ { | |
+ if (namebuf[namebuflen - 1] == '(' || namebuf[namebuflen - 1] == '>') | |
+ { | |
+ // Trim off trailing '(' and '>' characters for a bit more cleanup. | |
+ namebuflen--; | |
+ namebuf[namebuflen] = 0; | |
+ } | |
+ Host::SetThreadName (LLDB_INVALID_PROCESS_ID, LLDB_INVALID_THREAD_ID, namebuf); | |
+ } | |
+ } | |
+} | |
+ | |
+void | |
+Host::Backtrace (Stream &strm, uint32_t max_frames) | |
+{ | |
+ // TODO: Is there a way to backtrace the current process on linux? | |
+} | |
+ | |
+size_t | |
+Host::GetEnvironment (StringList &env) | |
+{ | |
+ // TODO: Is there a way to the host environment for this process on linux? | |
+ return 0; | |
+} | |
Index: source/Host/common/Host.cpp | |
=================================================================== | |
--- source/Host/common/Host.cpp (revision 181496) | |
+++ source/Host/common/Host.cpp (working copy) | |
@@ -512,7 +512,8 @@ | |
{ | |
} | |
-#if !defined (__APPLE__) && !defined (__FreeBSD__) // see macosx/Host.mm | |
+#if !defined (__APPLE__) && !defined (__FreeBSD__) && !defined (__linux__) // see macosx/Host.mm | |
+ | |
void | |
Host::ThreadCreated (const char *thread_name) | |
{ | |
@@ -531,7 +532,7 @@ | |
return 0; | |
} | |
-#endif | |
+#endif // #if !defined (__APPLE__) && !defined (__FreeBSD__) && !defined (__linux__) | |
struct HostThreadCreateInfo | |
{ | |
@@ -652,7 +653,7 @@ | |
return thread_name; | |
} | |
-void | |
+bool | |
Host::SetThreadName (lldb::pid_t pid, lldb::tid_t tid, const char *name) | |
{ | |
#if defined(__APPLE__) && MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 | |
@@ -667,8 +668,33 @@ | |
// Set the pthread name if possible | |
if (pid == curr_pid && tid == curr_tid) | |
{ | |
- ::pthread_setname_np (name); | |
+ if (::pthread_setname_np (name) == 0) | |
+ return true; | |
} | |
+ return false; | |
+#elif defined (__linux__) | |
+ void *fn = dlsym (RTLD_DEFAULT, "pthread_setname_np"); | |
+ if (fn) | |
+ { | |
+ int (*pthread_setname_np_func)(pthread_t thread, const char *name); | |
+ *reinterpret_cast<void **> (&pthread_setname_np_func) = fn; | |
+ | |
+ lldb::pid_t curr_pid = Host::GetCurrentProcessID(); | |
+ lldb::tid_t curr_tid = Host::GetCurrentThreadID(); | |
+ | |
+ if (pid == LLDB_INVALID_PROCESS_ID) | |
+ pid = curr_pid; | |
+ | |
+ if (tid == LLDB_INVALID_THREAD_ID) | |
+ tid = curr_tid; | |
+ | |
+ if (pid == curr_pid) | |
+ { | |
+ if (pthread_setname_np_func (tid, name) == 0) | |
+ return true; | |
+ } | |
+ } | |
+ return false; | |
#endif | |
} | |
Index: include/lldb/Host/Host.h | |
=================================================================== | |
--- include/lldb/Host/Host.h (revision 181496) | |
+++ include/lldb/Host/Host.h (working copy) | |
@@ -299,7 +299,7 @@ | |
/// \b true if the thread name was able to be set, \b false | |
/// otherwise. | |
//------------------------------------------------------------------ | |
- static void | |
+ static bool | |
SetThreadName (lldb::pid_t pid, lldb::tid_t tid, const char *name); | |
//------------------------------------------------------------------ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment