From owner-freebsd-bugs@FreeBSD.ORG Mon Nov 5 10:20:00 2007 Return-Path: Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id D65CF16A469 for ; Mon, 5 Nov 2007 10:20:00 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:4f8:fff6::28]) by mx1.freebsd.org (Postfix) with ESMTP id B385913C48D for ; Mon, 5 Nov 2007 10:20:00 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) by freefall.freebsd.org (8.14.1/8.14.1) with ESMTP id lA5AK0rN023265 for ; Mon, 5 Nov 2007 10:20:00 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.1/8.14.1/Submit) id lA5AK0K7023264; Mon, 5 Nov 2007 10:20:00 GMT (envelope-from gnats) Resent-Date: Mon, 5 Nov 2007 10:20:00 GMT Resent-Message-Id: <200711051020.lA5AK0K7023264@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-bugs@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, Andrew Li Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 25E2916A417 for ; Mon, 5 Nov 2007 10:13:11 +0000 (UTC) (envelope-from nobody@FreeBSD.org) Received: from www.freebsd.org (www.freebsd.org [IPv6:2001:4f8:fff6::21]) by mx1.freebsd.org (Postfix) with ESMTP id 1822E13C491 for ; Mon, 5 Nov 2007 10:13:11 +0000 (UTC) (envelope-from nobody@FreeBSD.org) Received: from www.freebsd.org (localhost [127.0.0.1]) by www.freebsd.org (8.14.1/8.14.1) with ESMTP id lA5ACx21047550 for ; Mon, 5 Nov 2007 10:12:59 GMT (envelope-from nobody@www.freebsd.org) Received: (from nobody@localhost) by www.freebsd.org (8.14.1/8.14.1/Submit) id lA5ACx0L047547; Mon, 5 Nov 2007 10:12:59 GMT (envelope-from nobody) Message-Id: <200711051012.lA5ACx0L047547@www.freebsd.org> Date: Mon, 5 Nov 2007 10:12:59 GMT From: Andrew Li To: freebsd-gnats-submit@FreeBSD.org X-Send-Pr-Version: www-3.1 Cc: Subject: kern/117836: [patch] Extend ktrace/kdump output X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 05 Nov 2007 10:20:01 -0000 >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@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 #include #include + #include + #include #include #include #include *************** *** 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 *************** *** 67,72 **** --- 68,76 ---- #include #include #include + #ifdef KTRACE + #include + #endif #include *************** *** 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 #include *************** *** 69,74 **** --- 70,78 ---- #include #include #include + #ifdef KTRACE + #include + #endif #include *************** *** 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< #include #include + #include + #include + #ifdef IPX + #include + #include + #endif + #ifdef NETATALK + #include + #endif + #include #include #include + #include + #include #include + #include #include #include #include + #include #include #include #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 + struct sockaddr_atm *atm; + #include + struct sockaddr_natm *natm; + #include + 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: