aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--BUGS2
-rw-r--r--TODO6
-rw-r--r--debian/changelog8
-rw-r--r--display_args.c3
-rw-r--r--etc/ltrace.conf50
-rw-r--r--ltrace.12
-rw-r--r--ltrace.h3
-rw-r--r--output.c2
-rw-r--r--process_event.c19
-rw-r--r--sysdeps/Linux/trace.c16
10 files changed, 86 insertions, 25 deletions
diff --git a/BUGS b/BUGS
index 7f172ac..ab9e52e 100644
--- a/BUGS
+++ b/BUGS
@@ -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?)
diff --git a/TODO b/TODO
index 7dd5c23..3c54326 100644
--- a/TODO
+++ b/TODO
@@ -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);
diff --git a/ltrace.1 b/ltrace.1
index c5ba623..281a2c5 100644
--- a/ltrace.1
+++ b/ltrace.1
@@ -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
diff --git a/ltrace.h b/ltrace.h
index bb0a20e..405b012 100644
--- a/ltrace.h
+++ b/ltrace.h
@@ -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);
diff --git a/output.c b/output.c
index 7672c1a..1ced922 100644
--- a/output.c
+++ b/output.c
@@ -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) {