mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-21 20:45:53 -04:00

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
72 lines
1.6 KiB
C
72 lines
1.6 KiB
C
#include <stdio.h>
|
|
#include <unistd.h>
|
|
#include <sys/wait.h>
|
|
|
|
volatile int release_child_flag = 0;
|
|
|
|
int main(int argc, char const *argv[])
|
|
{
|
|
pid_t child = fork();
|
|
if (child == -1)
|
|
{
|
|
perror("fork");
|
|
return 1;
|
|
}
|
|
|
|
if (child > 0)
|
|
{ // parent
|
|
if (argc < 2)
|
|
{
|
|
fprintf(stderr, "Need pid filename.\n");
|
|
return 2;
|
|
}
|
|
|
|
// Let the test suite know the child's pid.
|
|
FILE *pid_file = fopen(argv[1], "w");
|
|
if (pid_file == NULL)
|
|
{
|
|
perror("fopen");
|
|
return 3;
|
|
}
|
|
|
|
fprintf(pid_file, "%d\n", child);
|
|
if (fclose(pid_file) == EOF)
|
|
{
|
|
perror("fclose");
|
|
return 4;
|
|
}
|
|
|
|
// And wait for the child to finish it's work.
|
|
int status = 0;
|
|
pid_t wpid = wait(&status);
|
|
if (wpid == -1)
|
|
{
|
|
perror("wait");
|
|
return 5;
|
|
}
|
|
if (wpid != child)
|
|
{
|
|
fprintf(stderr, "wait() waited for wrong child\n");
|
|
return 6;
|
|
}
|
|
if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
|
|
{
|
|
fprintf(stderr, "child did not exit correctly\n");
|
|
return 7;
|
|
}
|
|
}
|
|
else
|
|
{ // child
|
|
lldb_enable_attach();
|
|
|
|
while (! release_child_flag) // Wait for debugger to attach
|
|
sleep(1);
|
|
|
|
printf("Child's previous process group is: %d\n", getpgid(0));
|
|
setpgid(0, 0); // Set breakpoint here
|
|
printf("Child's process group set to: %d\n", getpgid(0));
|
|
}
|
|
|
|
return 0;
|
|
}
|