1 /* $NetBSD: db_xxx.c,v 1.17 2002/08/26 11:34:29 scw Exp $ */ 2 3 /* 4 * Copyright (c) 1982, 1986, 1989, 1991, 1993 5 * The Regents of the University of California. All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. All advertising materials mentioning features or use of this software 16 * must display the following acknowledgement: 17 * This product includes software developed by the University of 18 * California, Berkeley and its contributors. 19 * 4. Neither the name of the University nor the names of its contributors 20 * may be used to endorse or promote products derived from this software 21 * without specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33 * SUCH DAMAGE. 34 * 35 * from: kern_proc.c 8.4 (Berkeley) 1/4/94 36 */ 37 38 /* 39 * Miscellaneous DDB functions that are intimate (xxx) with various 40 * data structures and functions used by the kernel (proc, callout). 41 */ 42 43 #include <sys/cdefs.h> 44 __KERNEL_RCSID(0, "$NetBSD: db_xxx.c,v 1.17 2002/08/26 11:34:29 scw Exp $"); 45 46 #include <sys/param.h> 47 #include <sys/systm.h> 48 #include <sys/kernel.h> 49 #include <sys/proc.h> 50 #include <sys/msgbuf.h> 51 52 #include <sys/callout.h> 53 #include <sys/signalvar.h> 54 #include <sys/resourcevar.h> 55 56 #include <machine/db_machdep.h> 57 58 #include <ddb/db_access.h> 59 #include <ddb/db_command.h> 60 #include <ddb/db_interface.h> 61 #include <ddb/db_lex.h> 62 #include <ddb/db_output.h> 63 #include <ddb/db_sym.h> 64 #include <ddb/db_extern.h> 65 66 void 67 db_kill_proc(db_expr_t addr, int haddr, db_expr_t count, char *modif) 68 { 69 struct proc *p; 70 db_expr_t pid, sig; 71 int t; 72 73 /* What pid? */ 74 if (!db_expression(&pid)) { 75 db_error("pid?\n"); 76 /*NOTREACHED*/ 77 } 78 /* What sig? */ 79 t = db_read_token(); 80 if (t == tCOMMA) { 81 if (!db_expression(&sig)) { 82 db_error("sig?\n"); 83 /*NOTREACHED*/ 84 } 85 } else { 86 db_unread_token(t); 87 sig = 15; 88 } 89 if (db_read_token() != tEOL) { 90 db_error("?\n"); 91 /*NOTREACHED*/ 92 } 93 94 p = pfind((pid_t)pid); 95 if (p == NULL) { 96 db_error("no such proc\n"); 97 /*NOTREACHED*/ 98 } 99 psignal(p, (int)sig); 100 } 101 102 void 103 db_show_all_procs(db_expr_t addr, int haddr, db_expr_t count, char *modif) 104 { 105 int i; 106 char *mode; 107 struct proc *p, *pp; 108 struct timeval tv[2]; 109 const struct proclist_desc *pd; 110 111 if (modif[0] == 0) 112 modif[0] = 'n'; /* default == normal mode */ 113 114 mode = strchr("mawn", modif[0]); 115 if (mode == NULL || *mode == 'm') { 116 db_printf("usage: show all procs [/a] [/n] [/w]\n"); 117 db_printf("\t/a == show process address info\n"); 118 db_printf("\t/n == show normal process info [default]\n"); 119 db_printf("\t/w == show process wait/emul info\n"); 120 return; 121 } 122 123 switch (*mode) { 124 case 'a': 125 db_printf(" PID %10s %18s %18s %18s\n", 126 "COMMAND", "STRUCT PROC *", "UAREA *", "VMSPACE/VM_MAP"); 127 break; 128 case 'n': 129 db_printf(" PID %10s %10s %10s S %7s %16s %7s\n", 130 "PPID", "PGRP", "UID", "FLAGS", "COMMAND", "WAIT"); 131 break; 132 case 'w': 133 db_printf(" PID %10s %8s %4s %5s %5s %-12s%s\n", 134 "COMMAND", "EMUL", "PRI", "UTIME", "STIME", 135 "WAIT-MSG", "WAIT-CHANNEL"); 136 break; 137 } 138 139 /* XXX LOCKING XXX */ 140 pd = proclists; 141 for (pd = proclists; pd->pd_list != NULL; pd++) { 142 LIST_FOREACH(p, pd->pd_list, p_list) { 143 pp = p->p_pptr; 144 if (p->p_stat == 0) { 145 continue; 146 } 147 148 db_printf("%c%-10d", " >"[curproc == p], p->p_pid); 149 150 switch (*mode) { 151 152 case 'a': 153 db_printf("%10.10s %18p %18p %18p\n", 154 p->p_comm, p, p->p_addr, p->p_vmspace); 155 break; 156 157 case 'n': 158 db_printf("%10d %10d %10d %d %#7x %16s %7.7s\n", 159 pp ? pp->p_pid : -1, p->p_pgrp->pg_id, 160 p->p_cred->p_ruid, p->p_stat, p->p_flag, 161 p->p_comm, (p->p_wchan && p->p_wmesg) ? 162 p->p_wmesg : ""); 163 break; 164 165 case 'w': 166 db_printf("%10s %8s %4d", p->p_comm, 167 p->p_emul->e_name,p->p_priority); 168 calcru(p, &tv[0], &tv[1], NULL); 169 for (i = 0; i < 2; ++i) { 170 db_printf("%4ld.%1ld", 171 (long)tv[i].tv_sec, 172 (long)tv[i].tv_usec/100000); 173 } 174 if (p->p_wchan && p->p_wmesg) { 175 db_printf(" %-12s", p->p_wmesg); 176 db_printsym( 177 (db_expr_t)(intptr_t)p->p_wchan, 178 DB_STGY_XTRN, db_printf); 179 } 180 db_printf("\n"); 181 break; 182 183 } 184 } 185 } 186 } 187 188 void 189 db_show_callout(db_expr_t addr, int haddr, db_expr_t count, char *modif) 190 { 191 uint64_t hint; 192 int i; 193 194 for (i = 0; i < callwheelsize; i++) { 195 struct callout_queue *bucket = &callwheel[i]; 196 struct callout *c = TAILQ_FIRST(&bucket->cq_q); 197 198 if (c) { 199 db_printf("bucket %d (hint %llx):\n", i, 200 (long long) bucket->cq_hint); 201 hint = UQUAD_MAX; 202 while (c) { 203 if (c->c_time < hint) 204 hint = c->c_time; 205 db_printf("%p: time %llx arg %p flags %x " 206 "func %p: ", c, (long long) c->c_time, 207 c->c_arg, c->c_flags, c->c_func); 208 db_printsym((u_long)c->c_func, DB_STGY_PROC, 209 db_printf); 210 db_printf("\n"); 211 c = TAILQ_NEXT(c, c_link); 212 } 213 if (bucket->cq_hint < hint) 214 printf("** HINT IS STALE\n"); 215 } 216 } 217 } 218 219 void 220 db_dmesg(db_expr_t addr, int haddr, db_expr_t count, char *modif) 221 { 222 struct kern_msgbuf *mbp; 223 int ch, newl, skip, i; 224 char *p, *bufdata; 225 226 mbp = msgbufp; 227 bufdata = &mbp->msg_bufc[0]; 228 229 for (newl = skip = i = 0, p = bufdata + mbp->msg_bufx; 230 i < mbp->msg_bufs; i++, p++) { 231 if (p == bufdata + mbp->msg_bufs) 232 p = bufdata; 233 ch = *p; 234 /* Skip "\n<.*>" syslog sequences. */ 235 if (skip) { 236 if (ch == '>') 237 newl = skip = 0; 238 continue; 239 } 240 if (newl && ch == '<') { 241 skip = 1; 242 continue; 243 } 244 if (ch == '\0') 245 continue; 246 newl = ch == '\n'; 247 db_printf("%c", ch); 248 } 249 if (!newl) 250 db_printf("\n"); 251 } 252