From a3a0907ffcd11f44aaa24154bff2181a09a16089 Mon Sep 17 00:00:00 2001 From: Tom Wilkie Date: Thu, 17 Sep 2015 04:05:52 +0000 Subject: [PATCH] It works again! --- experimental/example/qotd/qotd.c | 13 ++++---- experimental/tracer/ptrace/ptracer.go | 43 ++++++++++----------------- 2 files changed, 21 insertions(+), 35 deletions(-) diff --git a/experimental/example/qotd/qotd.c b/experimental/example/qotd/qotd.c index d61314966..082f99eaa 100644 --- a/experimental/example/qotd/qotd.c +++ b/experimental/example/qotd/qotd.c @@ -8,17 +8,13 @@ /* this function is run by the thread */ void *thread_func(void *sock) { struct sockaddr_in dest; - char buffer[1024]; + char in_buffer[1024]; + char out_buffer[1024]; int sockfd = (int)sock; int clientfd; printf("I'm thread %d\n", syscall(SYS_gettid)); - if (read(sockfd, buffer, sizeof(buffer)) < 0) { - perror("ERROR reading from socket"); - return; - } - clientfd = socket(AF_INET, SOCK_STREAM, 0); if (clientfd < 0) { perror("ERROR opening socket"); @@ -37,10 +33,11 @@ void *thread_func(void *sock) { return; } - int readbytes = recv(clientfd, buffer, sizeof(buffer), 0); + int readbytes = recv(clientfd, in_buffer, sizeof(in_buffer), 0); close(clientfd); - if (write(sockfd, buffer, read) < 0) { + int writtenbytes = snprintf(out_buffer, sizeof(out_buffer), "{\"qotd\": %s}\n", in_buffer); + if (write(sockfd, out_buffer, writtenbytes) < 0) { perror("ERROR writing to socket"); return; } diff --git a/experimental/tracer/ptrace/ptracer.go b/experimental/tracer/ptrace/ptracer.go index 2530bccb7..af7a89d85 100644 --- a/experimental/tracer/ptrace/ptracer.go +++ b/experimental/tracer/ptrace/ptracer.go @@ -142,28 +142,9 @@ func (t *PTracer) traceThread(pid int, process *process) *thread { return } - var status syscall.WaitStatus - if _, err = syscall.Wait4(pid, &status, 0, nil); err != nil { - log.Printf("Wait %d failed: %v", pid, err) - return - } - - thread.attached = true - - err = syscall.PtraceSetOptions(pid, ptraceOptions) - if err != nil { - log.Printf("SetOptions failed, pid=%d, err=%v", pid, err) - return - } - - err = syscall.PtraceSyscall(pid, 0) - if err != nil { - log.Printf("PtraceSyscall failed, pid=%d, err=%v", pid, err) - return - } - t.threads[pid] = thread result <- thread + select { case t.childAttached <- struct{}{}: default: @@ -180,20 +161,18 @@ func (t *PTracer) waitLoop() { ) for { - log.Printf("Waiting...") + //log.Printf("Waiting...") pid, err = syscall.Wait4(-1, &status, syscall.WALL, nil) if err != nil && err.(syscall.Errno) == syscall.ECHILD { - log.Printf( "No children to wait4") + //log.Printf( "No children to wait4") <-t.childAttached continue } - if err != nil { log.Printf(" Wait failed: %v %d", err, err.(syscall.Errno)) return } - - log.Printf(" PID %d stopped with signal %#x", pid, status) + //log.Printf(" PID %d stopped with signal %#x", pid, status) t.stopped <- stopped{pid, status} } } @@ -221,9 +200,19 @@ func (t *PTracer) handleStopped(pid int, status syscall.WaitStatus) { return } - if status.Stopped() && status.StopSignal() == syscall.SIGTRAP|ptraceTracesysgoodBit { + if !target.attached { + target.attached = true + + err = syscall.PtraceSetOptions(pid, ptraceOptions) + if err != nil { + log.Printf("SetOptions failed, pid=%d, err=%v", pid, err) + return + } + + } else if status.Stopped() && status.StopSignal() == syscall.SIGTRAP|ptraceTracesysgoodBit { // pid entered Syscall-enter-stop or syscall-exit-stop target.syscallStopped() + } else if status.Stopped() && status.StopSignal() == syscall.SIGTRAP { // pid entered PTRACE_EVENT stop switch status.TrapCause() { @@ -254,7 +243,7 @@ func (t *PTracer) handleStopped(pid int, status syscall.WaitStatus) { } // Restart stopped caller in syscall trap mode. - log.Printf("Restarting pid %d with signal %d", pid, int(signal)) + // log.Printf("Restarting pid %d with signal %d", pid, int(signal)) err = syscall.PtraceSyscall(pid, int(signal)) if err != nil { log.Printf("PtraceSyscall failed, pid=%d, err=%v", pid, err)