diff options
author | Juan Cespedes <cespedes@debian.org> | 1998-03-13 19:31:29 +0100 |
---|---|---|
committer | Juan Cespedes <cespedes@debian.org> | 1998-03-13 19:31:29 +0100 |
commit | 81690ef1a83d7a093daaebc1a87cdb9ec6f74589 (patch) | |
tree | b2efb63e291b09443028ea5b238d9313348c79ee | |
parent | 1fe93d5b55ad2b8d4009a63e343db19cc1f21bb0 (diff) | |
download | ltrace-81690ef1a83d7a093daaebc1a87cdb9ec6f74589.tar.gz |
Version 0.2.5
* After a successful execve(), library calls are now logged
* Enhanced displaying of non-printable chars
* Added some functions to /etc/ltrace.conf
-rw-r--r-- | BUGS | 2 | ||||
-rw-r--r-- | TODO | 6 | ||||
-rw-r--r-- | debian/changelog | 8 | ||||
-rw-r--r-- | display_args.c | 3 | ||||
-rw-r--r-- | etc/ltrace.conf | 50 | ||||
-rw-r--r-- | ltrace.1 | 2 | ||||
-rw-r--r-- | ltrace.h | 3 | ||||
-rw-r--r-- | output.c | 2 | ||||
-rw-r--r-- | process_event.c | 19 | ||||
-rw-r--r-- | sysdeps/Linux/trace.c | 16 |
10 files changed, 86 insertions, 25 deletions
@@ -1,7 +1,5 @@ * processes attached with option -p die when the attacher is interrupted -* option -p and -f don't work yet * option -f doesn't work yet -* if a program uses `execve()', later syscalls aren't logged correctly * Manual page is not accurate (config files...) * elf.c only supports elf32 binaries * netscape sometimes dies with SIGSEGV (is this still true?) @@ -1,8 +1,6 @@ -* Option -p: disable breakpoints on exit +* Improve documentation +* Regarding option -p: disable breakpoints on exit * Option -f (trace children) -* Option -u (run command as username handling setuid and/or setgid) -* SYSCALLS: - + execve() <- trace new program * Display different argument types: + format + how to display execl...? diff --git a/debian/changelog b/debian/changelog index 09099c7..5b46fc2 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,11 @@ +ltrace (0.2.5) unstable; urgency=low + + * After a successful execve(), library calls are now logged + * Enhanced displaying of non-printable chars + * Added some functions to /etc/ltrace.conf + + -- Juan Cespedes <cespedes@debian.org> Fri, 13 Mar 1998 19:16:47 +0100 + ltrace (0.2.4) unstable; urgency=low * Option `-p' now works (but programs fail when ltrace is interrupted) diff --git a/display_args.c b/display_args.c index dde6e6d..b3ce31e 100644 --- a/display_args.c +++ b/display_args.c @@ -61,10 +61,11 @@ static int display_char(char what) case '\r': return fprintf(output, "\\r"); case '\n': return fprintf(output, "\\n"); case '\t': return fprintf(output, "\\t"); + case '\b': return fprintf(output, "\\b"); case '\\': return fprintf(output, "\\"); default: if ((what<32) || (what>126)) { - return fprintf(output, "\\%03o", what); + return fprintf(output, "\\%03o", (unsigned char)what); } else { return fprintf(output, "%c", what); } diff --git a/etc/ltrace.conf b/etc/ltrace.conf index 375d08a..e581e94 100644 --- a/etc/ltrace.conf +++ b/etc/ltrace.conf @@ -21,6 +21,11 @@ int open(string,int,octal); ; WARNING: 3rd argument may not be there ; getopt.h int getopt_long(int,addr,string,addr,addr); +int getopt_long_only(int,addr,string,addr,addr); + +; grp.h +void endgrent(void); +addr getgrnam(string); ; libintl.h string bindtextdomain(string, string); @@ -32,13 +37,25 @@ int _IO_putc(char,file); ; locale.h string setlocale(int, string); +; pwd.h +void endpwent(void); +addr getpwnam(string); + +; signal.h +int kill(int,int); + ; stdio.h int fclose(file); +int ferror(file); +int fflush(file); addr fgets(+string, uint, file); int fileno(file); int fprintf(file,format); +int fputc(char,file); int fputs(string,file); +uint fwrite(string,uint,uint,file); int printf(format); +int sprintf(+string,format); ; stdlib.h int atexit(addr); @@ -47,47 +64,62 @@ void exit(int); void free(addr); string getenv(string); addr malloc(int); +void qsort(addr,uint,uint,addr); +addr realloc(addr,uint); ; string.h string basename(string); +addr memchr(string,char,uint); +addr memcpy(addr,string3,uint); addr memset(addr,char,int); string rindex(string,char); addr stpcpy(addr,string); string strcat(string, string); +string strchr(string,char); int strcmp(string,string); addr strcpy(addr,string); addr strdup(string); +string strerror(int); int strncmp(string,string,int); addr strncpy(addr,string3,uint); string strrchr(string,char); string strstr(string,string); +; sys/stat.h +int chmod(string,octal); +int mkfifo(string,octal); +octal umask(octal); + +; sys/utsname.h +int uname(addr); + +; sys/vfs.h +int statfs(string,addr); + ; term.h int tputs(string, int, addr); +; time.h +int time(addr); + ; unistd.h +int chown(string,int,int); int close(int); int execlp(string,string,addr,addr,addr); int fork(void); +string2 getcwd(addr,uint); int geteuid(void); int gethostname(+string2,int); int isatty(int); int mkdir(string,octal); int read(int, +string0, uint); +int rmdir(string); int sethostname(+string2,int); uint sleep(uint); +int symlink(string,string); int sync(void); int write(int, string3, uint); -; sys/stat.h -octal umask(octal); - -; sys/utsname.h -int uname(addr); - -; time.h -int time(addr); - ; SYSCALLS addr SYS_brk(addr); int SYS_close(int); @@ -17,7 +17,7 @@ which are called by the executed process and the signals which are received by that process. .PP Its use is very similar to -.BR strace(1). +.BR strace(1) . .SH OPTIONS .TP @@ -121,7 +121,8 @@ extern void * get_stack_pointer(int pid); extern void * get_return_addr(int pid, void * stack_pointer); extern void insert_breakpoint(int pid, struct breakpoint * sbp); extern void delete_breakpoint(int pid, struct breakpoint * sbp); -extern int child_p(int sysnum); +extern int fork_p(int sysnum); +extern int exec_p(int sysnum); extern int syscall_p(struct process * proc, int status); extern int sysret_p(struct process * proc, int status); extern void continue_process(pid_t pid); @@ -71,7 +71,7 @@ void output_left(enum tof type, struct process * proc, char * function_name) struct function * func; if (current_pid) { -#if 1 /* ugly hack :) */ +#if 0 /* FIXME: should I do this? */ if (current_pid == proc->pid && proc->type_being_displayed == LT_TOF_FUNCTION && proc->type_being_displayed == type) { diff --git a/process_event.c b/process_event.c index 170c37d..2827bc5 100644 --- a/process_event.c +++ b/process_event.c @@ -6,6 +6,7 @@ #include "ltrace.h" #include "output.h" #include "options.h" +#include "elf.h" static void process_signal(struct event * event); static void process_exit(struct event * event); @@ -138,11 +139,13 @@ static void process_syscall(struct event * event) if (opt_S) { output_left(LT_TOF_SYSCALL, event->proc, sysname(event->e_un.sysnum)); } - if (child_p(event->e_un.sysnum)) { + if (fork_p(event->e_un.sysnum) || exec_p(event->e_un.sysnum)) { disable_all_breakpoints(event->proc); if (event->proc->current_symbol) { delete_breakpoint(event->proc->pid, &event->proc->return_value); } + } else if (!event->proc->breakpoints_enabled) { + enable_all_breakpoints(event->proc); } continue_process(event->proc->pid); } @@ -152,7 +155,19 @@ static void process_sysret(struct event * event) if (opt_S) { output_right(LT_TOF_SYSCALL, event->proc, sysname(event->e_un.sysnum)); } - if (child_p(event->e_un.sysnum)) { + if (exec_p(event->e_un.sysnum)) { + if (gimme_arg(LT_TOF_SYSCALL,event->proc,-1)==0) { + event->proc->filename = pid2name(event->proc->pid); + event->proc->list_of_symbols = read_elf(event->proc->filename); + event->proc->breakpoints_enabled = -1; + } else { + enable_all_breakpoints(event->proc); + if (event->proc->current_symbol) { + insert_breakpoint(event->proc->pid, &event->proc->return_value); + } + } + } + if (fork_p(event->e_un.sysnum)) { enable_all_breakpoints(event->proc); if (event->proc->current_symbol) { insert_breakpoint(event->proc->pid, &event->proc->return_value); diff --git a/sysdeps/Linux/trace.c b/sysdeps/Linux/trace.c index 1068a84..10fff3e 100644 --- a/sysdeps/Linux/trace.c +++ b/sysdeps/Linux/trace.c @@ -8,14 +8,22 @@ #include "ltrace.h" #include "options.h" -/* Returns 1 if a new child is about to be created - (ie, with fork() or clone()) - Returns 0 otherwise. */ -int child_p(int sysnum) +/* Returns 1 if the sysnum may make a new child to be created + * (ie, with fork() or clone()) + * Returns 0 otherwise. + */ +int fork_p(int sysnum) { return (sysnum == __NR_fork || sysnum == __NR_clone); } +/* Returns 1 if the sysnum may make the process exec other program + */ +int exec_p(int sysnum) +{ + return (sysnum == __NR_execve); +} + void trace_me(void) { if (ptrace(PTRACE_TRACEME, 0, 1, 0)<0) { |