Hi!
I'm trying to get a setup where I can write to tracee's stdin from a 3rd process while debugging.
I thought that the best way to get this is to start both the debugger and the tracee from a common parent.
Here's what I have (the interesting part are the PTRACE_DETACH lines):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56 | #include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <wait.h>
#include <sys/ptrace.h>
int main(int argc, char** argv) {
int wait_status;
if (argc != 2) {
printf("Argument: Binary to debug.");
exit(1);
}
int fd[2];
pipe(fd);
pid_t pid_to_debug = fork();
if (pid_to_debug == 0) {
close(fd[1]);
close(0);
dup(fd[0]);
ptrace(PTRACE_TRACEME, 0, 0, 0);
execl(argv[1], argv[1], (char*)0);
}
close(fd[0]);
printf("Child pid %d\n", pid_to_debug);
waitpid(pid_to_debug, &wait_status, 0);
//ptrace(PTRACE_DETACH, pid_to_debug, 0, SIGSTOP); // Codeclap hangs, gdb works
ptrace(PTRACE_DETACH, pid_to_debug, 0, 0); // Lets pid_to_debug run = not good
dprintf(fd[1], "payload");
close(fd[1]);
int use_gdb = 0;
int use_codeclap = 1;
if(use_gdb ^ use_codeclap) {
printf("Start debugger\n");
pid_t pid_debugger = fork();
if (pid_debugger == 0) {
char buffer[100];
sprintf(buffer, "%d", pid_to_debug);
if (use_gdb) {
execlp("gdb", "gdb", argv[1], buffer,
(char*)0);
}
if (use_codeclap) {
execlp("codeclap", "codeclap", buffer,
(char*)0);
}
}
}
do {
waitpid(pid_to_debug, &wait_status, 0);
} while (WIFSTOPPED(wait_status));
}
|
Unfortunately when I try to attach to a SIGSTOPped process with codeclap it just hangs.
Codeclap backtrace:
| #0 0x00007fdffb6c2c45 in pthread_cond_wait@@GLIBC_2.3.2 () from /usr/lib/libpthread.so.0
#1 0x00000000004e2feb in DebuggerStart ()
#2 0x00000000005281b3 in DebuggerFrontendProcess ()
#3 0x000000000053b7e3 in xcbFrontendThread.constprop.221 ()
#4 0x0000000000460d4e in main ()
|
I had quite a few other problems as well when playing with attaching so maybe it's just alpha. I'll list some additional UX things I saw just in case:
* Even normal attach of a running process throught the ui hangs maybe 20% of the time. Same pthread_cond_wait@@GLIBC_2.3.2.
* Pressing continue/step/etc. after attaching just detaches. It's quite confusing. Things normalize if I repeatedly hit run+pause all threads until I hit debuggable code. Also stacktrace doesn't show anything before "getting out of limbo".
* I think it would be better to automatically open the first thread in debug view after attaching. Now you have to first select a thread to do anything which is annoying.
Overall Codeclap seems very promising! Looking forward to having an awesome debugger on Linux.