diff options
Diffstat (limited to 'lldb/packages/Python/lldbsuite/test')
10 files changed, 42 insertions, 134 deletions
diff --git a/lldb/packages/Python/lldbsuite/test/README-TestSuite b/lldb/packages/Python/lldbsuite/test/README-TestSuite index 6df4d7bd7be..70e4c91b889 100644 --- a/lldb/packages/Python/lldbsuite/test/README-TestSuite +++ b/lldb/packages/Python/lldbsuite/test/README-TestSuite @@ -157,3 +157,10 @@ o Writing test cases: then use SBInterpreter::HandleCommand to run the command. You get the full result text from the command in the command return object, and all the part where you are driving the debugger to the point you want to test will be more robust. + +o Attaching in test cases: + + If you need to attach to inferiors in your tests, you must make sure the inferior calls + lldb_enable_attach(), before the debugger attempts to attach. This function performs any + platform-specific processing needed to enable attaching to this process (e.g., on Linux, we + execute prctl(PR_SET_TRACER) syscall to disable protections present in some Linux systems). diff --git a/lldb/packages/Python/lldbsuite/test/driver/batch_mode/main.c b/lldb/packages/Python/lldbsuite/test/driver/batch_mode/main.c index c1f1651e75e..c85a0f272d2 100644 --- a/lldb/packages/Python/lldbsuite/test/driver/batch_mode/main.c +++ b/lldb/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; diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/attach_resume/main.cpp b/lldb/packages/Python/lldbsuite/test/functionalities/attach_resume/main.cpp index 7cf36025854..82aad70eed5 100644 --- a/lldb/packages/Python/lldbsuite/test/functionalities/attach_resume/main.cpp +++ b/lldb/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 @@ void *start(void *data) 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]; diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/process_attach/main.cpp b/lldb/packages/Python/lldbsuite/test/functionalities/process_attach/main.cpp index 8021feac5c7..46ffacc0a84 100644 --- a/lldb/packages/Python/lldbsuite/test/functionalities/process_attach/main.cpp +++ b/lldb/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; diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/process_group/main.c b/lldb/packages/Python/lldbsuite/test/functionalities/process_group/main.c index c730c629e8b..7e986bbac65 100644 --- a/lldb/packages/Python/lldbsuite/test/functionalities/process_group/main.c +++ b/lldb/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 @@ int main(int argc, char const *argv[]) } 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); diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/register/main.cpp b/lldb/packages/Python/lldbsuite/test/functionalities/register/main.cpp index 876dd0833e5..156515768dd 100644 --- a/lldb/packages/Python/lldbsuite/test/functionalities/register/main.cpp +++ b/lldb/packages/Python/lldbsuite/test/functionalities/register/main.cpp @@ -8,10 +8,6 @@ //===----------------------------------------------------------------------===// #include <stdio.h> -#if defined(__linux__) -#include <sys/prctl.h> -#endif - #include <chrono> #include <thread> @@ -19,18 +15,7 @@ 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; diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/thread/create_after_attach/main.cpp b/lldb/packages/Python/lldbsuite/test/functionalities/thread/create_after_attach/main.cpp index 8434458f064..d8f06e55a2d 100644 --- a/lldb/packages/Python/lldbsuite/test/functionalities/thread/create_after_attach/main.cpp +++ b/lldb/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 @@ thread_2_func (void *input) 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); diff --git a/lldb/packages/Python/lldbsuite/test/make/test_common.h b/lldb/packages/Python/lldbsuite/test/make/test_common.h index 6f819706366..39b85322bf0 100644 --- a/lldb/packages/Python/lldbsuite/test/make/test_common.h +++ b/lldb/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
diff --git a/lldb/packages/Python/lldbsuite/test/python_api/hello_world/main.c b/lldb/packages/Python/lldbsuite/test/python_api/hello_world/main.c index 31a041ede74..1b942d0db15 100644 --- a/lldb/packages/Python/lldbsuite/test/python_api/hello_world/main.c +++ b/lldb/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) diff --git a/lldb/packages/Python/lldbsuite/test/tools/lldb-server/main.cpp b/lldb/packages/Python/lldbsuite/test/tools/lldb-server/main.cpp index c65b2257159..b97c6ebc18e 100644 --- a/lldb/packages/Python/lldbsuite/test/tools/lldb-server/main.cpp +++ b/lldb/packages/Python/lldbsuite/test/tools/lldb-server/main.cpp @@ -20,10 +20,6 @@ int pthread_threadid_np(pthread_t,__uint64_t*); #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 @@ thread_func (void *arg) 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; |