- fix attaching to process (attach patch) - add fork & exec patches from IBM - adjust weak symbol handling (ppc32fc5 patch)
200 lines
5.9 KiB
Diff
200 lines
5.9 KiB
Diff
diff -Naurp ltrace-0.4/ltrace.h ltrace-0.4-Getmsg/ltrace.h
|
|
--- ltrace-0.4/ltrace.h 2006-02-20 16:48:07.000000000 -0500
|
|
+++ ltrace-0.4-Getmsg/ltrace.h 2006-07-18 02:23:36.000000000 -0400
|
|
@@ -12,6 +12,7 @@
|
|
#include "sysdep.h"
|
|
|
|
#define MAX_LIBRARY 30
|
|
+#define TRACE_FORK 1
|
|
|
|
#if defined HAVE_LIBIBERTY || defined HAVE_LIBSUPC__
|
|
# define USE_DEMANGLE
|
|
@@ -170,7 +171,7 @@ extern void show_summary(void);
|
|
|
|
/* Arch-dependent stuff: */
|
|
extern char *pid2name(pid_t pid);
|
|
-extern void trace_set_options(struct process *proc, pid_t pid);
|
|
+extern void trace_set_options(struct process *proc, pid_t pid, int option);
|
|
extern void trace_me(void);
|
|
extern int trace_pid(pid_t pid);
|
|
extern void untrace_pid(pid_t pid);
|
|
@@ -198,5 +199,5 @@ extern void *plt2addr(struct process *,
|
|
#if 0 /* not yet */
|
|
extern int umoven(struct process *proc, void *addr, int len, void *laddr);
|
|
#endif
|
|
-
|
|
+extern ulong get_child_pid(pid_t pid);
|
|
#endif
|
|
diff -Naurp ltrace-0.4/proc.c ltrace-0.4-Getmsg/proc.c
|
|
--- ltrace-0.4/proc.c 2006-02-20 16:48:07.000000000 -0500
|
|
+++ ltrace-0.4-Getmsg/proc.c 2006-07-17 06:00:36.000000000 -0400
|
|
@@ -22,10 +22,11 @@ struct process *open_program(char *filen
|
|
}
|
|
proc->filename = filename;
|
|
proc->breakpoints_enabled = -1;
|
|
+ proc->pid = 0;
|
|
+ breakpoints_init(proc);
|
|
if (pid) {
|
|
proc->pid = pid;
|
|
}
|
|
- breakpoints_init(proc);
|
|
|
|
proc->next = list_of_processes;
|
|
list_of_processes = proc;
|
|
@@ -37,11 +38,13 @@ void open_pid(pid_t pid, int verbose)
|
|
struct process *proc;
|
|
char *filename;
|
|
|
|
+#if 0
|
|
if (trace_pid(pid) < 0) {
|
|
fprintf(stderr, "Cannot attach to pid %u: %s\n", pid,
|
|
strerror(errno));
|
|
return;
|
|
}
|
|
+#endif
|
|
|
|
filename = pid2name(pid);
|
|
|
|
@@ -54,7 +57,6 @@ void open_pid(pid_t pid, int verbose)
|
|
return;
|
|
}
|
|
#endif
|
|
-
|
|
proc = open_program(filename, pid);
|
|
- proc->breakpoints_enabled = 1;
|
|
+ proc->breakpoints_enabled = -1;
|
|
}
|
|
diff -Naurp ltrace-0.4/process_event.c ltrace-0.4-Getmsg/process_event.c
|
|
--- ltrace-0.4/process_event.c 2006-02-20 16:48:07.000000000 -0500
|
|
+++ ltrace-0.4-Getmsg/process_event.c 2006-07-18 03:05:16.000000000 -0400
|
|
@@ -223,16 +223,6 @@ static void process_sysret(struct event
|
|
if (opt_T || opt_c) {
|
|
calc_time_spent(event->proc);
|
|
}
|
|
- if (fork_p(event->proc, event->e_un.sysnum)) {
|
|
- if (opt_f) {
|
|
- pid_t child =
|
|
- gimme_arg(LT_TOF_SYSCALLR, event->proc, -1);
|
|
- if (child > 0) {
|
|
- open_pid(child, 0);
|
|
- }
|
|
- }
|
|
- enable_all_breakpoints(event->proc);
|
|
- }
|
|
callstack_pop(event->proc);
|
|
if (opt_S) {
|
|
output_right(LT_TOF_SYSCALLR, event->proc,
|
|
diff -Naurp ltrace-0.4/sysdeps/linux-gnu/trace.c ltrace-0.4-Getmsg/sysdeps/linux-gnu/trace.c
|
|
--- ltrace-0.4/sysdeps/linux-gnu/trace.c 2006-02-20 16:48:07.000000000 -0500
|
|
+++ ltrace-0.4-Getmsg/sysdeps/linux-gnu/trace.c 2006-07-18 02:49:35.000000000 -0400
|
|
@@ -90,7 +90,7 @@ int trace_pid(pid_t pid)
|
|
return 0;
|
|
}
|
|
|
|
-void trace_set_options(struct process *proc, pid_t pid)
|
|
+void trace_set_options(struct process *proc, pid_t pid, int option)
|
|
{
|
|
#ifndef PTRACE_SETOPTIONS
|
|
#define PTRACE_SETOPTIONS 0x4200
|
|
@@ -101,10 +101,21 @@ void trace_set_options(struct process *p
|
|
#ifndef PTRACE_O_TRACESYSGOOD
|
|
#define PTRACE_O_TRACESYSGOOD 0x00000001
|
|
#endif
|
|
+#ifndef PTRACE_O_TRACEFORK
|
|
+#define PTRACE_O_TRACEFORK 0x00000002
|
|
+#endif
|
|
+
|
|
+ ulong setoptions = 0;
|
|
+
|
|
if (proc->tracesysgood & 0x80)
|
|
return;
|
|
- if (ptrace(PTRACE_SETOPTIONS, pid, 0, PTRACE_O_TRACESYSGOOD) < 0 &&
|
|
- ptrace(PTRACE_OLDSETOPTIONS, pid, 0, PTRACE_O_TRACESYSGOOD) < 0) {
|
|
+
|
|
+ setoptions |= PTRACE_O_TRACESYSGOOD;
|
|
+ if (TRACE_FORK == option){
|
|
+ setoptions |= PTRACE_O_TRACEFORK;
|
|
+ }
|
|
+ if (ptrace(PTRACE_SETOPTIONS, pid, 0, setoptions) < 0 &&
|
|
+ ptrace(PTRACE_OLDSETOPTIONS, pid, 0, PTRACE_O_TRACESYSGOOD) < 0){
|
|
perror("PTRACE_SETOPTIONS");
|
|
return;
|
|
}
|
|
@@ -175,3 +186,18 @@ int umovestr(struct process *proc, void
|
|
*(char *)(laddr + offset) = '\0';
|
|
return 0;
|
|
}
|
|
+
|
|
+ulong get_child_pid(pid_t pid)
|
|
+{
|
|
+#ifndef PTRACE_GETEVENTMSG
|
|
+#define PTRACE_GETEVENTMSG 0x4201
|
|
+#endif
|
|
+ ulong child_pid = 9999;
|
|
+
|
|
+ if( ptrace(PTRACE_GETEVENTMSG, pid, 0, &child_pid) < 0) {
|
|
+ perror("PTRACE_GETEVENTMSG");
|
|
+ return 0;
|
|
+ }
|
|
+ return child_pid;
|
|
+}
|
|
+
|
|
diff -Naurp ltrace-0.4/wait_for_something.c ltrace-0.4-Getmsg/wait_for_something.c
|
|
--- ltrace-0.4/wait_for_something.c 2006-02-20 16:48:07.000000000 -0500
|
|
+++ ltrace-0.4-Getmsg/wait_for_something.c 2006-07-18 02:32:26.000000000 -0400
|
|
@@ -14,15 +14,17 @@
|
|
#include "options.h"
|
|
#include "debug.h"
|
|
|
|
+#define FORK_MASK 0x00010000
|
|
static struct event event;
|
|
|
|
/* This should also update `current_process' */
|
|
|
|
static struct process *pid2proc(int pid);
|
|
+void verify(int sig_status);
|
|
|
|
struct event *wait_for_something(void)
|
|
{
|
|
- pid_t pid;
|
|
+ pid_t pid, child_pid;
|
|
int status;
|
|
int tmp;
|
|
|
|
@@ -54,7 +56,11 @@ struct event *wait_for_something(void)
|
|
if (event.proc->breakpoints_enabled == -1) {
|
|
enable_all_breakpoints(event.proc);
|
|
event.thing = LT_EV_NONE;
|
|
- trace_set_options(event.proc, event.proc->pid);
|
|
+ if(opt_f){
|
|
+ trace_set_options(event.proc, event.proc->pid, TRACE_FORK);
|
|
+ }else{
|
|
+ trace_set_options(event.proc, event.proc->pid, 0);
|
|
+ }
|
|
continue_process(event.proc->pid);
|
|
return &event;
|
|
}
|
|
@@ -92,6 +98,17 @@ struct event *wait_for_something(void)
|
|
event.e_un.signum = WSTOPSIG(status);
|
|
return &event;
|
|
}
|
|
+ if((WSTOPSIG(status) == SIGTRAP) && (status & FORK_MASK)) {
|
|
+ event.thing = LT_EV_NONE;
|
|
+ event.e_un.signum = WSTOPSIG(status);
|
|
+ child_pid = (pid_t) get_child_pid(event.proc->pid);
|
|
+ if (child_pid){
|
|
+ open_pid(child_pid,0);
|
|
+ }
|
|
+ enable_all_breakpoints(event.proc);
|
|
+ continue_after_signal(event.proc->pid, event.e_un.signum);
|
|
+ return &event;
|
|
+ }
|
|
event.thing = LT_EV_BREAKPOINT;
|
|
if (!event.proc->instruction_pointer) {
|
|
event.proc->instruction_pointer =
|
|
@@ -115,3 +132,4 @@ static struct process *pid2proc(pid_t pi
|
|
}
|
|
return NULL;
|
|
}
|
|
+
|