File ltrace.trunk-r75.patch of Package ltrace
------------------------------------------------------------------------
r75 | pmachata-guest | 2007-01-25 17:05:44 +0000 (Thu, 25 Jan 2007) | 4 lines
Changed paths:
M /ltrace/trunk/ChangeLog
M /ltrace/trunk/breakpoints.c
M /ltrace/trunk/proc.c
M /ltrace/trunk/sysdeps/linux-gnu/trace.c
- fix -p behavior: wait for process to stop after PTRACE_ATTACH
- fix -L behavior: always initialize the breakpoint dictionary,
and thus aviod NULL dereference.
------------------------------------------------------------------------
Index: proc.c
===================================================================
--- proc.c (revision 74)
+++ proc.c (revision 75)
@@ -56,5 +56,6 @@ void open_pid(pid_t pid, int verbose)
#endif
proc = open_program(filename, pid);
+ continue_process (pid);
proc->breakpoints_enabled = 1;
}
Index: ChangeLog
===================================================================
--- ChangeLog (revision 74)
+++ ChangeLog (revision 75)
@@ -1,3 +1,13 @@
+2007-01-19 Petr Machata <pmachata@redhat.com>
+
+ * sysdeps/linux-gnu/trace.c (trace_pid): wait for child to stop,
+ as indicated by ptrace documentation.
+ * proc.c (open_pid): start the traced child again, it will have
+ been stopped after trace_pid. Fixes tracing with -p.
+ * breakpoints.c: initialize proc->breakpoints always, don't wait
+ untill it might be needed. This renders a check in insert_breakpoint
+ superfluous. Fixes a sigsegvs experienced with -L.
+
2006-12-28 Eric Vaitl <evaitl@cisco.com>
* sysdeps/linux-gnu/mipsel/* Added mipsel support
Index: sysdeps/linux-gnu/trace.c
===================================================================
--- sysdeps/linux-gnu/trace.c (revision 74)
+++ sysdeps/linux-gnu/trace.c (revision 75)
@@ -4,6 +4,7 @@
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
+#include <sys/wait.h>
#include "ptrace.h"
#include <asm/unistd.h>
@@ -87,6 +88,16 @@ int trace_pid(pid_t pid)
if (ptrace(PTRACE_ATTACH, pid, 1, 0) < 0) {
return -1;
}
+
+ /* man ptrace: PTRACE_ATTACH attaches to the process specified
+ in pid. The child is sent a SIGSTOP, but will not
+ necessarily have stopped by the completion of this call;
+ use wait() to wait for the child to stop. */
+ if (waitpid (pid, NULL, 0) != pid) {
+ perror ("trace_pid: waitpid");
+ exit (1);
+ }
+
return 0;
}
Index: breakpoints.c
===================================================================
--- breakpoints.c (revision 74)
+++ breakpoints.c (revision 75)
@@ -30,12 +30,6 @@ insert_breakpoint(struct process *proc,
struct breakpoint *sbp;
debug(1, "symbol=%s, addr=%p", libsym?libsym->name:"(nil)", addr);
- if (!proc->breakpoints) {
- proc->breakpoints =
- dict_init(dict_key2hash_int, dict_key_cmp_int);
- /* atexit(brk_dict_clear); *//* why bother to do this on exit? */
- }
-
if (!addr)
return;
@@ -169,6 +163,7 @@ void breakpoints_init(struct process *pr
dict_clear(proc->breakpoints);
proc->breakpoints = NULL;
}
+ proc->breakpoints = dict_init(dict_key2hash_int, dict_key_cmp_int);
if (opt_L && proc->filename) {
proc->list_of_symbols = read_elf(proc);