labath created this revision.
labath added a reviewer: clayborg.
labath added a subscriber: lldb-commits.

On linux we need the process to give us special permissions before we can 
attach to it.
Previously, the code for this was copied into every file that needed it. This 
moves the code to a
central place to reduce code duplication.

http://reviews.llvm.org/D15992

Files:
  packages/Python/lldbsuite/test/driver/batch_mode/main.c
  packages/Python/lldbsuite/test/functionalities/attach_resume/main.cpp
  packages/Python/lldbsuite/test/functionalities/process_attach/main.cpp
  packages/Python/lldbsuite/test/functionalities/process_group/main.c
  packages/Python/lldbsuite/test/functionalities/register/main.cpp
  
packages/Python/lldbsuite/test/functionalities/thread/create_after_attach/main.cpp
  packages/Python/lldbsuite/test/make/test_common.h
  packages/Python/lldbsuite/test/python_api/hello_world/main.c
  packages/Python/lldbsuite/test/tools/lldb-server/main.cpp

Index: packages/Python/lldbsuite/test/tools/lldb-server/main.cpp
===================================================================
--- packages/Python/lldbsuite/test/tools/lldb-server/main.cpp
+++ packages/Python/lldbsuite/test/tools/lldb-server/main.cpp
@@ -20,10 +20,6 @@
 #include <sys/syscall.h>
 #endif
 
-#if defined(__linux__)
-#include <sys/prctl.h>
-#endif
-
 static const char *const RETVAL_PREFIX               = "retval:";
 static const char *const SLEEP_PREFIX                = "sleep:";
 static const char *const STDERR_PREFIX               = "stderr:";
@@ -210,16 +206,7 @@
 
 int main (int argc, char **argv)
 {
-#if defined(__linux__)
-    // Immediately enable any ptracer so that we can allow the stub attach
-    // operation to succeed.  Some Linux kernels are locked down so that
-    // only an ancestor can be a ptracer of a process.  This disables that
-    // restriction.  Without it, attach-related stub tests will fail.
-#if defined(PR_SET_PTRACER) && defined(PR_SET_PTRACER_ANY)
-    const int prctl_result = prctl(PR_SET_PTRACER, PR_SET_PTRACER_ANY, 0, 0, 0);
-    static_cast<void> (prctl_result);
-#endif
-#endif
+	lldb_enable_attach();
 
 	std::vector<pthread_t> threads;
 	std::unique_ptr<uint8_t[]> heap_array_up;
Index: packages/Python/lldbsuite/test/python_api/hello_world/main.c
===================================================================
--- packages/Python/lldbsuite/test/python_api/hello_world/main.c
+++ packages/Python/lldbsuite/test/python_api/hello_world/main.c
@@ -1,25 +1,8 @@
 #include <stdio.h>
 
-#if defined(__linux__)
-#include <sys/prctl.h>
-#endif
-
-int main(int argc, char const *argv[]) {
-
-#if defined(__linux__)
-    // Immediately enable any ptracer so that we can allow the stub attach
-    // operation to succeed.  Some Linux kernels are locked down so that
-    // only an ancestor process can be a ptracer of a process.  This disables that
-    // restriction.  Without it, attach-related stub tests will fail.
-#if defined(PR_SET_PTRACER) && defined(PR_SET_PTRACER_ANY)
-    int prctl_result;
-
-    // For now we execute on best effort basis.  If this fails for
-    // some reason, so be it.
-    prctl_result = prctl(PR_SET_PTRACER, PR_SET_PTRACER_ANY, 0, 0, 0);
-    (void) prctl_result;
-#endif
-#endif
+int main(int argc, char const *argv[])
+{
+    lldb_enable_attach();
 
     printf("Hello world.\n"); // Set break point at this line.
     if (argc == 1)
Index: packages/Python/lldbsuite/test/make/test_common.h
===================================================================
--- packages/Python/lldbsuite/test/make/test_common.h
+++ packages/Python/lldbsuite/test/make/test_common.h
@@ -17,3 +17,28 @@
 // declared.  This may not be necessary after MSVC 12.
 #include <eh.h>
 #endif
+
+
+// On some systems (e.g., some versions of linux) it is not possible to attach to a process
+// without it giving us special permissions. This defines the lldb_enable_attach macro, which
+// should perform any such actions, if needed by the platform. This is a macro instead of a
+// function to avoid the need for complex linking of the test programs.
+#if defined(__linux__)
+#include <sys/prctl.h>
+
+#if defined(PR_SET_PTRACER) && defined(PR_SET_PTRACER_ANY)
+// For now we execute on best effort basis.  If this fails for some reason, so be it.
+#define lldb_enable_attach()                                                          \
+    do                                                                                \
+    {                                                                                 \
+        const int prctl_result = prctl(PR_SET_PTRACER, PR_SET_PTRACER_ANY, 0, 0, 0);  \
+        (void)prctl_result;                                                           \
+    } while (0)
+
+#endif
+
+#else // not linux
+
+#define lldb_enable_attach()
+
+#endif
Index: packages/Python/lldbsuite/test/functionalities/thread/create_after_attach/main.cpp
===================================================================
--- packages/Python/lldbsuite/test/functionalities/thread/create_after_attach/main.cpp
+++ packages/Python/lldbsuite/test/functionalities/thread/create_after_attach/main.cpp
@@ -4,10 +4,6 @@
 
 using std::chrono::microseconds;
 
-#if defined(__linux__)
-#include <sys/prctl.h>
-#endif
-
 volatile int g_thread_2_continuing = 0;
 
 void *
@@ -42,20 +38,7 @@
 
 int main(int argc, char const *argv[])
 {
-#if defined(__linux__)
-    // Immediately enable any ptracer so that we can allow the stub attach
-    // operation to succeed.  Some Linux kernels are locked down so that
-    // only an ancestor process can be a ptracer of a process.  This disables that
-    // restriction.  Without it, attach-related stub tests will fail.
-#if defined(PR_SET_PTRACER) && defined(PR_SET_PTRACER_ANY)
-    int prctl_result;
-
-    // For now we execute on best effort basis.  If this fails for
-    // some reason, so be it.
-    prctl_result = prctl(PR_SET_PTRACER, PR_SET_PTRACER_ANY, 0, 0, 0);
-    (void) prctl_result;
-#endif
-#endif
+    lldb_enable_attach();
 
     // Create a new thread
     std::thread thread_1(thread_1_func, nullptr);
Index: packages/Python/lldbsuite/test/functionalities/register/main.cpp
===================================================================
--- packages/Python/lldbsuite/test/functionalities/register/main.cpp
+++ packages/Python/lldbsuite/test/functionalities/register/main.cpp
@@ -8,29 +8,14 @@
 //===----------------------------------------------------------------------===//
 #include <stdio.h>
 
-#if defined(__linux__)
-#include <sys/prctl.h>
-#endif
-
 #include <chrono>
 #include <thread>
 
 long double outermost_return_long_double (long double my_long_double);
 
 int main (int argc, char const *argv[])
 {
-#if defined(__linux__)
-    // Immediately enable any ptracer so that we can allow the stub attach
-    // operation to succeed.  Some Linux kernels are locked down so that
-    // only an ancestor process can be a ptracer of a process.  This disables that
-    // restriction.  Without it, attach-related stub tests will fail.
-#if defined(PR_SET_PTRACER) && defined(PR_SET_PTRACER_ANY)
-    // For now we execute on best effort basis.  If this fails for
-    // some reason, so be it.
-    const int prctl_result = prctl(PR_SET_PTRACER, PR_SET_PTRACER_ANY, 0, 0, 0);
-    static_cast<void> (prctl_result);
-#endif
-#endif
+    lldb_enable_attach();
 
     char my_string[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 0};
     double my_double = 1234.5678;
Index: packages/Python/lldbsuite/test/functionalities/process_group/main.c
===================================================================
--- packages/Python/lldbsuite/test/functionalities/process_group/main.c
+++ packages/Python/lldbsuite/test/functionalities/process_group/main.c
@@ -2,10 +2,6 @@
 #include <unistd.h>
 #include <sys/wait.h>
 
-#if defined(__linux__)
-#include <sys/prctl.h>
-#endif
-
 volatile int release_child_flag = 0;
 
 int main(int argc, char const *argv[])
@@ -61,18 +57,7 @@
     }
     else
     { // child
-#if defined(__linux__)
-        // Immediately enable any ptracer so that we can allow the stub attach
-        // operation to succeed.  Some Linux kernels are locked down so that
-        // only an ancestor process can be a ptracer of a process.  This disables that
-        // restriction.  Without it, attach-related stub tests will fail.
-#if defined(PR_SET_PTRACER) && defined(PR_SET_PTRACER_ANY)
-        // For now we execute on best effort basis.  If this fails for
-        // some reason, so be it.
-        const int prctl_result = prctl(PR_SET_PTRACER, PR_SET_PTRACER_ANY, 0, 0, 0);
-        (void) prctl_result;
-#endif
-#endif
+        lldb_enable_attach();
 
         while (! release_child_flag) // Wait for debugger to attach
             sleep(1);
Index: packages/Python/lldbsuite/test/functionalities/process_attach/main.cpp
===================================================================
--- packages/Python/lldbsuite/test/functionalities/process_attach/main.cpp
+++ packages/Python/lldbsuite/test/functionalities/process_attach/main.cpp
@@ -1,28 +1,11 @@
 #include <stdio.h>
 
-#if defined(__linux__)
-#include <sys/prctl.h>
-#endif
-
 #include <chrono>
 #include <thread>
 
 int main(int argc, char const *argv[]) {
     int temp;
-#if defined(__linux__)
-    // Immediately enable any ptracer so that we can allow the stub attach
-    // operation to succeed.  Some Linux kernels are locked down so that
-    // only an ancestor process can be a ptracer of a process.  This disables that
-    // restriction.  Without it, attach-related stub tests will fail.
-#if defined(PR_SET_PTRACER) && defined(PR_SET_PTRACER_ANY)
-    int prctl_result;
-
-    // For now we execute on best effort basis.  If this fails for
-    // some reason, so be it.
-    prctl_result = prctl(PR_SET_PTRACER, PR_SET_PTRACER_ANY, 0, 0, 0);
-    (void) prctl_result;
-#endif
-#endif
+    lldb_enable_attach();
 
     // Waiting to be attached by the debugger.
     temp = 0;
Index: packages/Python/lldbsuite/test/functionalities/attach_resume/main.cpp
===================================================================
--- packages/Python/lldbsuite/test/functionalities/attach_resume/main.cpp
+++ packages/Python/lldbsuite/test/functionalities/attach_resume/main.cpp
@@ -4,10 +4,6 @@
 #include <chrono>
 #include <thread>
 
-#if defined(__linux__)
-#include <sys/prctl.h>
-#endif
-
 volatile bool debugger_flag = true; // The debugger will flip this to false
 
 void *start(void *data)
@@ -25,18 +21,7 @@
 
 int main(int argc, char const *argv[])
 {
-#if defined(__linux__)
-    // Immediately enable any ptracer so that we can allow the stub attach
-    // operation to succeed.  Some Linux kernels are locked down so that
-    // only an ancestor process can be a ptracer of a process.  This disables that
-    // restriction.  Without it, attach-related stub tests will fail.
-#if defined(PR_SET_PTRACER) && defined(PR_SET_PTRACER_ANY)
-    // For now we execute on best effort basis.  If this fails for
-    // some reason, so be it.
-    const int prctl_result = prctl(PR_SET_PTRACER, PR_SET_PTRACER_ANY, 0, 0, 0);
-    static_cast<void> (prctl_result);
-#endif
-#endif
+    lldb_enable_attach();
 
     static const size_t nthreads = 16;
     std::thread threads[nthreads];
Index: packages/Python/lldbsuite/test/driver/batch_mode/main.c
===================================================================
--- packages/Python/lldbsuite/test/driver/batch_mode/main.c
+++ packages/Python/lldbsuite/test/driver/batch_mode/main.c
@@ -2,25 +2,10 @@
 #include <string.h>
 #include <unistd.h>
 
-#if defined(__linux__)
-#include <sys/prctl.h>
-#endif
-
 int 
 main (int argc, char **argv)
 {
-#if defined(__linux__)
-        // Immediately enable any ptracer so that we can allow the stub attach
-        // operation to succeed.  Some Linux kernels are locked down so that
-        // only an ancestor process can be a ptracer of a process.  This disables that
-        // restriction.  Without it, attach-related stub tests will fail.
-#if defined(PR_SET_PTRACER) && defined(PR_SET_PTRACER_ANY)
-        // For now we execute on best effort basis.  If this fails for
-        // some reason, so be it.
-        const int prctl_result = prctl(PR_SET_PTRACER, PR_SET_PTRACER_ANY, 0, 0, 0);
-        (void) prctl_result;
-#endif
-#endif
+    lldb_enable_attach();
 
     int do_crash = 0;
     int do_wait = 0;
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to