Sort Xrefs. Use err(3). Remove uneeded #include.

Correct usage: one of {-p pid, command} is required.
Open output file when command line is fully analyzed: incorrect `truss -o f'
command does not create an empty file anymore.
This commit is contained in:
Philippe Charnier 1998-01-05 07:30:26 +00:00
parent 2632a83f1e
commit 3cf51049e0
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=32275
8 changed files with 107 additions and 100 deletions

View File

@ -27,9 +27,13 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
*/
#ifndef lint
static const char rcsid[] =
"$Id$";
#endif /* not lint */
/*
* FreeBSD/386-specific system call handling. This is probably the most
* complex part of the entire truss program, although I've got lots of
@ -37,17 +41,13 @@
* automatically, thanks to /usr/src/sys/kern/syscalls.master. The
* names used for the various structures are confusing, I sadly admit.
*/
/*
* $Id: i386-fbsd.c,v 1.1 1997/12/06 05:22:50 sef Exp $
*/
#include <errno.h>
#include <fcntl.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <err.h>
#include <signal.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/pioctl.h>
@ -113,7 +113,6 @@ i386_syscall_entry(int pid, int nargs) {
struct reg regs = { 0 };
int syscall;
int i;
int memfd;
unsigned int parm_offset;
struct syscall *sc;
@ -190,7 +189,6 @@ i386_syscall_entry(int pid, int nargs) {
*/
if (fsc.name) {
char *tmp;
#if DEBUG
fprintf(stderr, "syscall %s(", fsc.name);

View File

@ -27,24 +27,25 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
*/
#ifndef lint
static const char rcsid[] =
"$Id$";
#endif /* not lint */
/*
* Linux/i386-specific system call handling. Given how much of this code
* is taken from the freebsd equivalent, I can probably put even more of
* it in support routines that can be used by any personality support.
*/
/*
* $Id: i386-linux.c,v 1.1 1997/12/06 05:22:54 sef Exp $
*/
#include <errno.h>
#include <fcntl.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <err.h>
#include <signal.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/pioctl.h>
@ -91,7 +92,6 @@ i386_linux_syscall_entry(int pid, int nargs) {
struct reg regs = { 0 };
int syscall;
int i;
int memfd;
struct syscall *sc;
if (fd == -1 || pid != cpid) {
@ -149,7 +149,6 @@ i386_linux_syscall_entry(int pid, int nargs) {
lsc.sc = sc;
if (lsc.name) {
char *tmp;
#ifdef DEBUG
fprintf(stderr, "syscall %s(", lsc.name);

View File

@ -27,9 +27,13 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
*/
#ifndef lint
static const char rcsid[] =
"$Id$";
#endif /* not lint */
/*
* FreeBSD/386-specific system call handling. This is probably the most
* complex part of the entire truss program, although I've got lots of
@ -37,17 +41,13 @@
* automatically, thanks to /usr/src/sys/kern/syscalls.master. The
* names used for the various structures are confusing, I sadly admit.
*/
/*
* $Id: i386-fbsd.c,v 1.1 1997/12/06 05:22:50 sef Exp $
*/
#include <errno.h>
#include <fcntl.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <err.h>
#include <signal.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/pioctl.h>
@ -113,7 +113,6 @@ i386_syscall_entry(int pid, int nargs) {
struct reg regs = { 0 };
int syscall;
int i;
int memfd;
unsigned int parm_offset;
struct syscall *sc;
@ -190,7 +189,6 @@ i386_syscall_entry(int pid, int nargs) {
*/
if (fsc.name) {
char *tmp;
#if DEBUG
fprintf(stderr, "syscall %s(", fsc.name);

View File

@ -27,24 +27,25 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
*/
#ifndef lint
static const char rcsid[] =
"$Id$";
#endif /* not lint */
/*
* Linux/i386-specific system call handling. Given how much of this code
* is taken from the freebsd equivalent, I can probably put even more of
* it in support routines that can be used by any personality support.
*/
/*
* $Id: i386-linux.c,v 1.1 1997/12/06 05:22:54 sef Exp $
*/
#include <errno.h>
#include <fcntl.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <err.h>
#include <signal.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/pioctl.h>
@ -91,7 +92,6 @@ i386_linux_syscall_entry(int pid, int nargs) {
struct reg regs = { 0 };
int syscall;
int i;
int memfd;
struct syscall *sc;
if (fd == -1 || pid != cpid) {
@ -149,7 +149,6 @@ i386_linux_syscall_entry(int pid, int nargs) {
lsc.sc = sc;
if (lsc.name) {
char *tmp;
#ifdef DEBUG
fprintf(stderr, "syscall %s(", lsc.name);

View File

@ -27,25 +27,26 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
*/
#ifndef lint
static const char rcsid[] =
"$Id$";
#endif /* not lint */
/*
* The main module for truss. Suprisingly simple, but, then, the other
* files handle the bulk of the work. And, of course, the kernel has to
* do a lot of the work :).
*/
/*
* $Id: main.c,v 1.5 1997/12/13 03:13:47 sef Exp $
*/
#include <err.h>
#include <errno.h>
#include <fcntl.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <err.h>
#include <signal.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/pioctl.h>
@ -65,14 +66,15 @@ extern void i386_linux_syscall_exit(int, int);
int pid = 0;
int nosigs = 0;
FILE *outfile = stderr;
char *prog;
int Procfd;
char progtype[50]; /* OS and type of executable */
static inline void
usage(void) {
fprintf(stderr, "usage: %s [-o <file>] [-S] { [-p <pid> ] | "
"[ <command> <args>] }\n", prog);
usage(void)
{
fprintf(stderr, "%s\n%s\n",
"usage: truss [-S] [-o file] -p pid",
" truss [-S] [-o file] command [args]");
exit(1);
}
@ -116,18 +118,15 @@ set_etype() {
return funcs;
}
int
main(int ac, char **av) {
int mask;
int c;
int i;
char **command;
struct procfs_status pfs;
char etype[25];
struct ex_types *funcs;
int fd;
int in_exec = 0;
prog = av[0];
char *fname = NULL;
while ((c = getopt(ac, av, "p:o:S")) != EOF) {
switch (c) {
@ -135,10 +134,7 @@ main(int ac, char **av) {
pid = atoi(optarg);
break;
case 'o': /* Specified output file */
if ((outfile = fopen(optarg, "w")) == NULL) {
fprintf (stderr, "%s: cannot open %s\n", av[0], optarg);
exit(1);
}
fname = optarg;
break;
case 'S': /* Don't trace signals */
nosigs = 1;
@ -152,6 +148,11 @@ main(int ac, char **av) {
if ((pid == 0 && ac == 0) || (pid != 0 && ac != 0))
usage();
if (fname != NULL) { /* Use output file */
if ((outfile = fopen(fname, "w")) == NULL)
errx(1, "cannot open %s", fname);
}
/*
* If truss starts the process itself, it will ignore some signals --
* they should be passed off to the process, which may or may not
@ -193,7 +194,7 @@ main(int ac, char **av) {
int val = 0;
if (ioctl(Procfd, PIOCWAIT, &pfs) == -1)
perror("PIOCWAIT top of loop");
warn("PIOCWAIT top of loop");
else {
switch(i = pfs.why) {
case S_SCE:
@ -229,7 +230,7 @@ main(int ac, char **av) {
}
}
if (ioctl(Procfd, PIOCCONT, val) == -1)
perror("PIOCCONT");
warn("PIOCCONT");
} while (pfs.why != S_EXIT);
return 0;
}

View File

@ -27,25 +27,26 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
*/
#ifndef lint
static const char rcsid[] =
"$Id$";
#endif /* not lint */
/*
* Various setup functions for truss. Not the cleanest-written code,
* I'm afraid.
*/
/*
* $Id: setup.c,v 1.5 1997/12/13 03:13:47 sef Exp $
*/
#include <err.h>
#include <errno.h>
#include <fcntl.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <err.h>
#include <fcntl.h>
#include <signal.h>
#include <sys/ioctl.h>
#include <sys/pioctl.h>
#include <sys/types.h>
@ -66,7 +67,6 @@ setup_and_wait(char *command[]) {
char buf[32];
int fd;
int pid;
extern char *prog;
int flags;
pid = vfork();
@ -88,7 +88,7 @@ setup_and_wait(char *command[]) {
* we want.
*/
if (ioctl(fd, PIOCSFL, flags) == -1)
perror("cannot set PF_LINGER");
warn("cannot set PF_LINGER");
execvp(command[0], command);
mask = ~0;
ioctl(fd, PIOCBIC, ~0);
@ -151,7 +151,7 @@ start_tracing(int pid, int flags) {
*/
if (ioctl(fd, PIOCSFL, 0) == -1)
perror("cannot clear PF_LINGER");
warn("cannot clear PF_LINGER");
return fd;
}

View File

@ -27,17 +27,19 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
*/
#ifndef lint
static const char rcsid[] =
"$Id$";
#endif /* not lint */
/*
* This file has routines used to print out system calls and their
* arguments.
*/
/*
* $Id: syscalls.c,v 1.2 1997/12/06 06:51:14 sef Exp $
*/
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@ -75,9 +77,11 @@ struct syscall syscalls[] = {
{ { Int, 0}, { Ioctl, 1 }, { Hex, 2 }}},
{ "break", 1, 1, { { Hex, 0 }}},
{ "exit", 0, 1, { { Hex, 0 }}},
{ 0, 0, 0, { 0, 0 } },
{ 0, 0, 0, { { 0, 0 }}},
};
char * ioctlname __P((int));
/*
* If/when the list gets big, it might be desirable to do it
* as a hash table or binary search.
@ -104,14 +108,12 @@ get_syscall(const char *name) {
char *
get_string(int procfd, void *offset, int max) {
char *buf, *tmp;
char *buf;
int size, len, c;
FILE *p;
if ((p = fdopen(procfd, "r")) == NULL) {
perror("fdopen");
exit(1);
}
if ((p = fdopen(procfd, "r")) == NULL)
err(1, "fdopen");
buf = malloc( size = (max ? max : 64 ) );
len = 0;
fseek(p, (long)offset, SEEK_SET);
@ -164,7 +166,7 @@ make_quad(unsigned long p1, unsigned long p2) {
char *
print_arg(int fd, struct syscall_args *sc, unsigned long *args) {
char *tmp;
char *tmp = NULL;
switch (sc->type & ARG_MASK) {
case Hex:
tmp = malloc(12);

View File

@ -2,35 +2,41 @@
.Dt TRUSS 1
.Os FreeBSD
.Sh NAME
.Nm \&truss
.Nm truss
.Nd trace system calls
.Sh Synopsis
.Nm \&truss
.Sh SYNOPSIS
.Nm truss
.Op Fl S
.Op Fl o Ar file
.Fl p Ar pid
.Nm truss
.Op Fl S
.Op Fl p Ar pid
.Op Fl o Ar file
command
.Op args
.Sh DESCRIPTION
.Nm \&truss
.Nm Truss
traces the system calls called by the specified process or program.
Output is to the specified output file, or standard error by default.
It does this by stopping and restarting the process being monitored via
.Xr procfs 5 .
.Pp
The options are as follows:
.Bl -tag -width command
.Bl -tag -width indent
.It Fl S
Do not display information about signals received by the process.
(Normally,
.Nm \&truss
.Nm
displays signal as well as system call events.)
.It Fl p
.It Fl o Ar file
Print the output to the specified
.Ar file
instead of standard error.
.It Fl p Ar pid
Follow the process specified by
.Ar pid
instead of a new command.
.It Fl o
Print the output to the specified file instead of standard error.
.It Ar command
.It Ar command Op args
Execute
.Ar command
and trace the system calls of it.
@ -47,11 +53,15 @@ options are mutually exclusive.)
# Follow an already-running process
.Dl $ truss -p 1
.Sh SEE ALSO
.Xr procfs 5 ,
.Xr kdump 1 ,
.Xr ktrace 1 ,
.Xr kdump 1
.Xr procfs 5
.Sh HISTORY
The
.Nm truss
command was written by Sean Eric Fagan for FreeBSD; it was modeled after
.Nm
command was written by
.An Sean Eric Fagan
for
.Bx Free Ns ;
it was modeled after
similar commands available for System V Release 4 and SunOS.