kern/117836: [patch] Extend ktrace/kdump output
Andrew Li
andrew2.li at citi.com
Mon Nov 5 02:20:01 PST 2007
>Number: 117836
>Category: kern
>Synopsis: [patch] Extend ktrace/kdump output
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: change-request
>Submitter-Id: current-users
>Arrival-Date: Mon Nov 05 10:20:00 UTC 2007
>Closed-Date:
>Last-Modified:
>Originator: Andrew Li
>Release: FreeBSD 8.0-CURRENT
>Organization:
Citigroup
>Environment:
FreeBSD elmo 8.0-CURRENT FreeBSD 8.0-CURRENT #4: Thu Nov 1 18:51:10 EST 2007 root at elmo:/usr/obj_current/var/src_current/sys/GENERIC i386
and
FreeBSD elmo 7.0-CURRENT FreeBSD 7.0-CURRENT #82: Fri Oct 19 16:34:25
EST 2007 root at elmo:/usr/obj_current/var/src_current/sys/GENERIC i386
>Description:
Extended ktrace/kdump output to decode struct sockaddr and struct stat. The new ktrace/kdump shows a more readable output for struct sockaddr and {f,l,}stat(2).
For example, the old ktrace/kdump on struct sockaddr:
2345 telnet CALL connect(0x3,0xbfbfe600,0x1c)
2345 telnet RET connect 0
The new ktrace/kdump on struct sockaddr:
2345 telnet CALL connect(0x3,0xbfbfe600,0x1c)
2345 telnet SOCK {AF_INET, 127.0.0.1:8000}
2345 telnet RET connect 0
Old ktrace/kdump for stat(2):
34536 stat CALL stat(0x8048614,0xbfbfe908)
34536 stat RET stat 0
New ktrace/kdump for stat(2):
34534 stat CALL stat(0x8048614,0xbfbfe908)
34534 stat STAT {dev=100, ino=383524, mode=-rw-r--r-- , nlink=1,
uid=1000, gid=1000, rdev=1528768, atime=1192715539, stime=1192471088,
ctime=1192471088, birthtime=1192471088, size=17898, blksize=4096,
blocks=36, flags=0x0}
34534 stat RET stat 0
The patch passed "make universe" on 7.0-CURRENT, and "make world" on 8.0-CURRENT.
>How-To-Repeat:
>Fix:
Patch attached with submission follows:
*** ./sys/kern/kern_ktrace.c.orig Thu Aug 30 07:17:11 2007
--- ./sys/kern/kern_ktrace.c Mon Oct 22 12:18:26 2007
***************
*** 51,56 ****
--- 51,58 ----
#include <sys/proc.h>
#include <sys/unistd.h>
#include <sys/vnode.h>
+ #include <sys/socket.h>
+ #include <sys/stat.h>
#include <sys/ktrace.h>
#include <sys/sx.h>
#include <sys/sysctl.h>
***************
*** 107,113 ****
sizeof(struct ktr_genio), /* KTR_GENIO */
sizeof(struct ktr_psig), /* KTR_PSIG */
sizeof(struct ktr_csw), /* KTR_CSW */
! 0 /* KTR_USER */
};
static STAILQ_HEAD(, ktr_request) ktr_free;
--- 109,117 ----
sizeof(struct ktr_genio), /* KTR_GENIO */
sizeof(struct ktr_psig), /* KTR_PSIG */
sizeof(struct ktr_csw), /* KTR_CSW */
! 0, /* KTR_USER */
! 0, /* KTR_SOCKADDR */
! 0 /* KTR_STAT */
};
static STAILQ_HEAD(, ktr_request) ktr_free;
***************
*** 552,557 ****
--- 556,610 ----
kc->user = user;
ktr_enqueuerequest(curthread, req);
}
+
+ void
+ ktrsockaddr(sin)
+ struct sockaddr *sin;
+ {
+ struct ktr_request *req;
+ char *buf = NULL;
+
+ if (sin && sin->sa_len > 0) {
+ buf = malloc(sin->sa_len, M_KTRACE, M_WAITOK);
+ bcopy(sin, buf, sin->sa_len);
+ }
+ req = ktr_getrequest(KTR_SOCKADDR);
+ if (req == NULL) {
+ if (buf != NULL)
+ free(buf, M_KTRACE);
+ return;
+ }
+ if (sin && sin->sa_len > 0) {
+ req->ktr_buffer = buf;
+ req->ktr_header.ktr_len = sin->sa_len;
+ }
+ ktr_submitrequest(curthread, req);
+ }
+
+ void
+ ktrstat(statp)
+ struct stat *statp;
+ {
+ struct ktr_request *req;
+ struct stat *buf = NULL;
+
+ if (statp) {
+ buf = malloc(sizeof(struct stat), M_KTRACE, M_WAITOK);
+ *buf = *statp;
+ }
+ req = ktr_getrequest(KTR_STAT);
+ if (req == NULL) {
+ if (buf != NULL)
+ free(buf, M_KTRACE);
+ return;
+ }
+ if (statp) {
+ req->ktr_buffer = buf;
+ req->ktr_header.ktr_len = sizeof(struct stat);
+ }
+
+ ktr_submitrequest(curthread, req);
+ }
#endif /* KTRACE */
/* Interface and common routines */
*** ./sys/kern/vfs_syscalls.c.orig Mon Sep 10 10:00:16 2007
--- ./sys/kern/vfs_syscalls.c Mon Oct 22 12:17:00 2007
***************
*** 38,43 ****
--- 38,44 ----
__FBSDID("$FreeBSD: src/sys/kern/vfs_syscalls.c,v 1.443 2007/09/10 00:00:16 rwatson Exp $");
#include "opt_compat.h"
+ #include "opt_ktrace.h"
#include "opt_mac.h"
#include <sys/param.h>
***************
*** 67,72 ****
--- 68,76 ----
#include <sys/jail.h>
#include <sys/syscallsubr.h>
#include <sys/sysctl.h>
+ #ifdef KTRACE
+ #include <sys/ktrace.h>
+ #endif
#include <machine/stdarg.h>
***************
*** 2118,2123 ****
--- 2122,2131 ----
if (error)
return (error);
*sbp = sb;
+ #ifdef KTRACE
+ if (KTRPOINT(td, KTR_STAT))
+ ktrstat(&sb);
+ #endif
return (0);
}
***************
*** 2169,2174 ****
--- 2177,2186 ----
if (error)
return (error);
*sbp = sb;
+ #ifdef KTRACE
+ if (KTRPOINT(td, KTR_STAT))
+ ktrstat(&sb);
+ #endif
return (0);
}
*** ./sys/kern/kern_descrip.c.orig Tue Aug 7 00:26:00 2007
--- ./sys/kern/kern_descrip.c Sat Oct 20 20:17:03 2007
***************
*** 39,44 ****
--- 39,45 ----
#include "opt_compat.h"
#include "opt_ddb.h"
+ #include "opt_ktrace.h"
#include <sys/param.h>
#include <sys/systm.h>
***************
*** 69,74 ****
--- 70,78 ----
#include <sys/sysproto.h>
#include <sys/unistd.h>
#include <sys/vnode.h>
+ #ifdef KTRACE
+ #include <sys/ktrace.h>
+ #endif
#include <security/audit/audit.h>
***************
*** 1129,1134 ****
--- 1133,1142 ----
error = fo_stat(fp, sbp, td->td_ucred, td);
fdrop(fp, td);
+ #ifdef KTRACE
+ if (error == 0 && KTRPOINT(td, KTR_STAT))
+ ktrstat(sbp);
+ #endif
return (error);
}
*** ./sys/kern/uipc_syscalls.c.orig Mon Aug 27 15:19:45 2007
--- ./sys/kern/uipc_syscalls.c Mon Nov 5 18:24:06 2007
***************
*** 227,232 ****
--- 227,236 ----
if (error)
return (error);
so = fp->f_data;
+ #ifdef KTRACE
+ if (KTRPOINT(td, KTR_SOCKADDR))
+ ktrsockaddr(sa);
+ #endif
#ifdef MAC
SOCK_LOCK(so);
error = mac_check_socket_bind(td->td_ucred, so, sa);
***************
*** 454,459 ****
--- 458,467 ----
/* check sa_len before it is destroyed */
if (*namelen > sa->sa_len)
*namelen = sa->sa_len;
+ #ifdef KTRACE
+ if (KTRPOINT(td, KTR_SOCKADDR))
+ ktrsockaddr(sa);
+ #endif
*name = sa;
sa = NULL;
}
***************
*** 548,553 ****
--- 556,565 ----
error = EALREADY;
goto done1;
}
+ #ifdef KTRACE
+ if (KTRPOINT(td, KTR_SOCKADDR))
+ ktrsockaddr(sa);
+ #endif
#ifdef MAC
SOCK_LOCK(so);
error = mac_check_socket_connect(td->td_ucred, so, sa);
***************
*** 1070,1075 ****
--- 1082,1091 ----
}
out:
fdrop(fp, td);
+ #ifdef KTRACE
+ if (fromsa && KTRPOINT(td, KTR_SOCKADDR))
+ ktrsockaddr(fromsa);
+ #endif
if (fromsa)
FREE(fromsa, M_SONAME);
***************
*** 1474,1479 ****
--- 1490,1499 ----
else
len = MIN(*alen, (*sa)->sa_len);
*alen = len;
+ #ifdef KTRACE
+ if (KTRPOINT(td, KTR_SOCKADDR))
+ ktrsockaddr(*sa);
+ #endif
bad:
fdrop(fp, td);
if (error && *sa) {
***************
*** 1571,1576 ****
--- 1591,1600 ----
else
len = MIN(*alen, (*sa)->sa_len);
*alen = len;
+ #ifdef KTRACE
+ if (KTRPOINT(td, KTR_SOCKADDR))
+ ktrsockaddr(*sa);
+ #endif
bad:
if (error && *sa) {
free(*sa, M_SONAME);
***************
*** 2347,2352 ****
--- 2371,2380 ----
error = getsock(td->td_proc->p_fd, uap->sd, &fp, NULL);
if (error)
goto sctp_bad;
+ #ifdef KTRACE
+ if (KTRPOINT(td, KTR_SOCKADDR))
+ ktrsockaddr(to);
+ #endif
iov[0].iov_base = uap->msg;
iov[0].iov_len = uap->mlen;
***************
*** 2450,2455 ****
--- 2478,2487 ----
error = copyiniov(uap->iov, uap->iovlen, &iov, EMSGSIZE);
if (error)
goto sctp_bad1;
+ #ifdef KTRACE
+ if (KTRPOINT(td, KTR_SOCKADDR))
+ ktrsockaddr(to);
+ #endif
so = (struct socket *)fp->f_data;
#ifdef MAC
***************
*** 2633,2638 ****
--- 2665,2674 ----
goto out;
}
}
+ #ifdef KTRACE
+ if (KTRPOINT(td, KTR_SOCKADDR))
+ ktrsockaddr(fromsa);
+ #endif
if (uap->msg_flags) {
error = copyout(&msg_flags, uap->msg_flags, sizeof (int));
if (error) {
*** ./sys/sys/ktrace.h.orig Tue Dec 27 09:09:09 2005
--- ./sys/sys/ktrace.h Sat Oct 20 20:15:41 2007
***************
*** 151,156 ****
--- 151,168 ----
#define KTR_USER 7
/*
+ * KTR_SOCKADDR - socket address calls
+ */
+ #define KTR_SOCKADDR 8
+ struct sockaddr;
+
+ /*
+ * KTR_STAT - file stat calls
+ */
+ #define KTR_STAT 9
+ struct stat;
+
+ /*
* KTR_DROP - If this bit is set in ktr_type, then at least one event
* between the previous record and this record was dropped.
*/
***************
*** 167,172 ****
--- 179,186 ----
#define KTRFAC_PSIG (1<<KTR_PSIG)
#define KTRFAC_CSW (1<<KTR_CSW)
#define KTRFAC_USER (1<<KTR_USER)
+ #define KTRFAC_SOCKADDR (1<<KTR_SOCKADDR)
+ #define KTRFAC_STAT (1<<KTR_STAT)
/*
* trace flags (also in p_traceflags)
*/
***************
*** 185,190 ****
--- 199,206 ----
void ktrsysret(int, int, register_t);
void ktrprocexit(struct thread *);
void ktruserret(struct thread *);
+ void ktrsockaddr(struct sockaddr *);
+ void ktrstat(struct stat *);
#else
*** ./usr.bin/kdump/kdump.c.orig Tue Jul 10 10:01:30 2007
--- ./usr.bin/kdump/kdump.c Mon Nov 5 21:04:38 2007
***************
*** 58,69 ****
--- 58,83 ----
#include <sys/ktrace.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
+ #include <sys/stat.h>
+ #include <sys/un.h>
+ #ifdef IPX
+ #include <sys/types.h>
+ #include <netipx/ipx.h>
+ #endif
+ #ifdef NETATALK
+ #include <netatalk/at.h>
+ #endif
+ #include <netinet/in.h>
#include <dlfcn.h>
#include <err.h>
+ #include <grp.h>
+ #include <inttypes.h>
#include <locale.h>
+ #include <pwd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+ #include <time.h>
#include <unistd.h>
#include <vis.h>
#include "ktrace.h"
***************
*** 80,92 ****
void ktrpsig(struct ktr_psig *);
void ktrcsw(struct ktr_csw *);
void ktruser(int, unsigned char *);
void usage(void);
const char *ioctlname(u_long);
! int timestamp, decimal, fancy = 1, suppressdata, tail, threads, maxdata;
const char *tracefile = DEF_TRACEFILE;
struct ktr_header ktr_header;
#define eqs(s1, s2) (strcmp((s1), (s2)) == 0)
int
--- 94,110 ----
void ktrpsig(struct ktr_psig *);
void ktrcsw(struct ktr_csw *);
void ktruser(int, unsigned char *);
+ void ktrsockaddr(struct sockaddr *);
+ void ktrstat(struct stat *);
void usage(void);
const char *ioctlname(u_long);
! int timestamp, decimal, fancy = 1, suppressdata, tail, threads, maxdata,
! resolv = 0;
const char *tracefile = DEF_TRACEFILE;
struct ktr_header ktr_header;
+ #define TIME_FORMAT "%b %e %T %Y"
#define eqs(s1, s2) (strcmp((s1), (s2)) == 0)
int
***************
*** 100,106 ****
(void) setlocale(LC_CTYPE, "");
! while ((ch = getopt(argc,argv,"f:dElm:np:HRsTt:")) != -1)
switch((char)ch) {
case 'f':
tracefile = optarg;
--- 118,124 ----
(void) setlocale(LC_CTYPE, "");
! while ((ch = getopt(argc,argv,"f:dElm:np:HRrsTt:")) != -1)
switch((char)ch) {
case 'f':
tracefile = optarg;
***************
*** 120,125 ****
--- 138,146 ----
case 'p':
pid = atoi(optarg);
break;
+ case 'r':
+ resolv = 1;
+ break;
case 's':
suppressdata = 1;
break;
***************
*** 209,214 ****
--- 230,241 ----
case KTR_USER:
ktruser(ktrlen, m);
break;
+ case KTR_SOCKADDR:
+ ktrsockaddr((struct sockaddr *)m);
+ break;
+ case KTR_STAT:
+ ktrstat((struct stat *)m);
+ break;
default:
printf("\n");
break;
***************
*** 260,265 ****
--- 287,298 ----
case KTR_USER:
type = "USER";
break;
+ case KTR_SOCKADDR:
+ type = "SOCK";
+ break;
+ case KTR_STAT:
+ type = "STAT";
+ break;
default:
(void)sprintf(unknown, "UNKNOWN(%d)", kth->ktr_type);
type = unknown;
***************
*** 1115,1120 ****
--- 1148,1294 ----
}
void
+ ktrsockaddr(struct sockaddr *kts)
+ {
+ /*
+ TODO: Support additional address families
+ #include <netatm/atm.h>
+ struct sockaddr_atm *atm;
+ #include <netnatm/natm.h>
+ struct sockaddr_natm *natm;
+ #include <netsmb/netbios.h>
+ struct sockaddr_nb *nb;
+ */
+ char addr[64];
+
+ printf("{ ");
+ sockaprotoname(kts->sa_family);
+ switch(kts->sa_family) {
+ case AF_INET: {
+ struct sockaddr_in *in;
+
+ in = (struct sockaddr_in *)kts;
+ printf(", %s:%u }\n", inet_ntoa(in->sin_addr),
+ ntohs(in->sin_port));
+ break;
+ }
+ #ifdef NETATALK
+ case AF_APPLETALK: {
+ struct sockaddr_at *at;
+ struct netrange *nr;
+
+ at = (struct sockaddr_at *)kts;
+ nr = &at->sat_range.r_netrange;
+ printf(", %d.%d, %d-%d, %d }\n", ntohs(at->sat_addr.s_net),
+ at->sat_addr.s_node, ntohs(nr->nr_firstnet),
+ ntohs(nr->nr_lastnet), nr->nr_phase);
+ break;
+ }
+ #endif
+ case AF_INET6: {
+ struct sockaddr_in6 *in6;
+
+ in6 = (struct sockaddr_in6 *)kts;
+ inet_ntop(AF_INET6, &in6->sin6_addr, addr, sizeof(addr));
+ printf(", [%s]:%u }\n", addr, htons(in6->sin6_port));
+ break;
+ }
+ #ifdef IPX
+ case AF_IPX: {
+ struct sockaddr_ipx *ipx;
+
+ ipx = (struct sockaddr_ipx *)kts;
+ printf(", %s }\n", ipx_ntoa(ipx->sipx_addr));
+ break;
+ }
+ #endif
+ case AF_UNIX: {
+ struct sockaddr_un *un;
+
+ un = (struct sockaddr_un *)kts;
+ printf(", %.*s }\n", un->sun_len, un->sun_path);
+ break;
+ }
+ default:
+ printf(", UNKNOWN FAMILY }\n");
+ }
+ }
+
+ void
+ ktrstat(struct stat *statp)
+ {
+ char mode[12], timestr[PATH_MAX + 4];
+ struct passwd *pwd;
+ struct group *grp;
+ struct tm *tm;
+
+ strmode(statp->st_mode, mode);
+ printf("{dev=%ju, ino=%ju, mode=%s, nlink=%ju, ",
+ (uintmax_t)statp->st_dev, (uintmax_t)statp->st_ino, mode,
+ (uintmax_t)statp->st_nlink);
+ if (resolv == 0 || (pwd = getpwuid(statp->st_uid)) == NULL)
+ printf("uid=%ju, ", (uintmax_t)statp->st_uid);
+ else
+ printf("uid=\"%s\", ", pwd->pw_name);
+ if (resolv == 0 || (grp = getgrgid(statp->st_gid)) == NULL)
+ printf("gid=%ju, ", (uintmax_t)statp->st_gid);
+ else
+ printf("gid=\"%s\", ", grp->gr_name);
+ printf("rdev=%ju, ", (uintmax_t)statp->st_rdev);
+ printf("atime=");
+ if (resolv == 0)
+ printf("%ld", statp->st_atimespec.tv_sec);
+ else {
+ tm = localtime(&statp->st_atimespec.tv_sec);
+ (void)strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
+ printf("\"%s\"", timestr);
+ }
+ if (statp->st_atimespec.tv_nsec != 0)
+ printf(".%09ld, ", statp->st_atimespec.tv_nsec);
+ else
+ printf(", ");
+ printf("stime=");
+ if (resolv == 0)
+ printf("%ld", statp->st_mtimespec.tv_sec);
+ else {
+ tm = localtime(&statp->st_mtimespec.tv_sec);
+ (void)strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
+ printf("\"%s\"", timestr);
+ }
+ if (statp->st_mtimespec.tv_nsec != 0)
+ printf(".%09ld, ", statp->st_mtimespec.tv_nsec);
+ else
+ printf(", ");
+ printf("ctime=");
+ if (resolv == 0)
+ printf("%ld", statp->st_ctimespec.tv_sec);
+ else {
+ tm = localtime(&statp->st_ctimespec.tv_sec);
+ (void)strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
+ printf("\"%s\"", timestr);
+ }
+ if (statp->st_ctimespec.tv_nsec != 0)
+ printf(".%09ld, ", statp->st_ctimespec.tv_nsec);
+ else
+ printf(", ");
+ printf("birthtime=");
+ if (resolv == 0)
+ printf("%ld", statp->st_birthtimespec.tv_sec);
+ else {
+ tm = localtime(&statp->st_birthtimespec.tv_sec);
+ (void)strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
+ printf("\"%s\"", timestr);
+ }
+ if (statp->st_birthtimespec.tv_nsec != 0)
+ printf(".%09ld, ", statp->st_birthtimespec.tv_nsec);
+ else
+ printf(", ");
+ printf("size=%jd, blksize=%ju, blocks=%jd, flags=0x%x}\n",
+ (uintmax_t)statp->st_size, (uintmax_t)statp->st_blksize,
+ (intmax_t)statp->st_blocks, statp->st_flags);
+ }
+
+ void
usage(void)
{
(void)fprintf(stderr,
*** ./usr.bin/kdump/mksubr.orig Tue Apr 10 05:16:24 2007
--- ./usr.bin/kdump/mksubr Sat Oct 20 20:15:07 2007
***************
*** 337,342 ****
--- 337,343 ----
auto_switch_type "minheritname" "INHERIT_[A-Z]+[[:space:]]+[0-9]+" "sys/mman.h"
auto_switch_type "quotactlname" "Q_[A-Z]+[[:space:]]+0x[0-9]+" "ufs/ufs/quota.h"
auto_if_type "sockdomainname" "PF_[[:alnum:]]+[[:space:]]+" "sys/socket.h"
+ auto_if_type "sockaprotoname" "AF_[[:alnum:]]+[[:space:]]+" "sys/socket.h"
auto_if_type "sockipprotoname" "IPPROTO_[[:alnum:]]+[[:space:]]+" "netinet/in.h"
auto_switch_type "sockoptname" "SO_[A-Z]+[[:space:]]+0x[0-9]+" "sys/socket.h"
auto_switch_type "socktypename" "SOCK_[A-Z]+[[:space:]]+[1-9]+[0-9]*" "sys/socket.h"
*** ./usr.bin/kdump/kdump.1.orig Fri Nov 18 21:36:28 2005
--- ./usr.bin/kdump/kdump.1 Mon Oct 22 22:10:02 2007
***************
*** 96,106 ****
same trace file.
.It Fl R
Display relative timestamps (time since previous entry).
.It Fl s
Suppress display of I/O data.
.It Fl T
Display absolute timestamps for each entry (seconds since epoch).
! .It Fl t Ar cnisuw
See the
.Fl t
option of
--- 96,109 ----
same trace file.
.It Fl R
Display relative timestamps (time since previous entry).
+ .It Fl r
+ Translate uid, gid and timespecs for STAT records into username,
+ groupname and local time, rather than reporting them as numbers.
.It Fl s
Suppress display of I/O data.
.It Fl T
Display absolute timestamps for each entry (seconds since epoch).
! .It Fl t Ar cnikstuw
See the
.Fl t
option of
***************
*** 165,171 ****
--- 168,176 ----
.It Li RET Ta return from syscall Ta syscall name and return value
.It Li NAMI Ta file name lookup Ta path to file
.It Li GENIO Ta general I/O Ta fd, read/write, number of bytes
+ .It Li SOCK Ta sockaddr syscall Ta struct sockaddr values
.It Li SIG Ta signal Ta signal name, handler, mask, code
+ .It Li STAT Ta stat syscall Ta struct stat values
.It Li CSW Ta context switch Ta stop/resume user/kernel
.It Li USER Ta data from user process Ta the data
.El
*** ./usr.bin/ktrace/ktrace.h.orig Sun Apr 28 23:00:16 2002
--- ./usr.bin/ktrace/ktrace.h Sat Oct 20 20:13:59 2007
***************
*** 35,41 ****
*/
#define DEF_POINTS (KTRFAC_SYSCALL | KTRFAC_SYSRET | KTRFAC_NAMEI | \
! KTRFAC_GENIO | KTRFAC_PSIG | KTRFAC_USER)
#define ALL_POINTS (DEF_POINTS | KTRFAC_CSW)
--- 35,42 ----
*/
#define DEF_POINTS (KTRFAC_SYSCALL | KTRFAC_SYSRET | KTRFAC_NAMEI | \
! KTRFAC_GENIO | KTRFAC_PSIG | KTRFAC_USER | \
! KTRFAC_SOCKADDR | KTRFAC_STAT)
#define ALL_POINTS (DEF_POINTS | KTRFAC_CSW)
*** ./usr.bin/ktrace/ktrace.1.orig Tue Nov 7 02:17:50 2006
--- ./usr.bin/ktrace/ktrace.1 Mon Oct 22 22:11:04 2007
***************
*** 117,131 ****
.It Cm i
trace
.Tn I/O
.It Cm s
trace signal processing
.It Cm u
userland traces
.It Cm w
context switches
.It Cm +
trace the default set of trace points -
! .Cm c , n , i , s , u
.El
.It Ar command
Execute
--- 117,135 ----
.It Cm i
trace
.Tn I/O
+ .It Cm k
+ trace sockaddr content
.It Cm s
trace signal processing
+ .It Cm t
+ trace stat struct for stat(2)
.It Cm u
userland traces
.It Cm w
context switches
.It Cm +
trace the default set of trace points -
! .Cm c , n , i , k , s , t , u
.El
.It Ar command
Execute
*** ./usr.bin/ktrace/subr.c.orig Sat Nov 27 17:51:38 2004
--- ./usr.bin/ktrace/subr.c Sat Oct 20 20:13:59 2007
***************
*** 71,79 ****
--- 71,85 ----
case 'i':
facs |= KTRFAC_GENIO;
break;
+ case 'k':
+ facs |= KTRFAC_SOCKADDR;
+ break;
case 's':
facs |= KTRFAC_PSIG;
break;
+ case 't':
+ facs |= KTRFAC_STAT;
+ break;
case 'u':
facs |= KTRFAC_USER;
break;
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list