Centralize the handling of attach permissions on linux in tests

Summary:
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.

Reviewers: clayborg

Subscribers: lldb-commits

Differential Revision: http://reviews.llvm.org/D15992

llvm-svn: 257319
This commit is contained in:
Pavel Labath 2016-01-11 10:24:50 +00:00
parent 054873b0be
commit d0f89cd721
10 changed files with 42 additions and 134 deletions

View File

@ -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).

View File

@ -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;

View File

@ -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];

View File

@ -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;

View File

@ -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);

View File

@ -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;

View File

@ -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);

View File

@ -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

View File

@ -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)

View File

@ -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;