Date: Tue, 08 May 2001 16:43:43 -0700 From: Dima Dorfman <dima@unixfreak.org> To: Dag-Erling Smorgrav <des@ofug.org> Cc: current@freebsd.org Subject: Re: pgm to kill 4.3 via vm Message-ID: <20010508234354.F0CB03E28@bazooka.unixfreak.org> In-Reply-To: <xzp8zk7k09s.fsf@flood.ping.uio.no>; from des@ofug.org on "08 May 2001 23:18:23 %2B0200"
next in thread | previous in thread | raw e-mail | index | archive | help
[ cc severely trimmed ] Dag-Erling Smorgrav <des@ofug.org> writes: > I would *love* to have a DDB equivalent to 'kill -9', so I could drop > to the DDB prompt, check ps, kill a process or two, and drop back out > of DDB. It would have saved me a reboot and a longish fsck in this > case. Mmm.. I implemented something like this a few days ago for similar reasons. Essentially it's a ddb interface to psignal(). I haven't tried using it to kill something like your program, but I have no reason to think it wouldn't work. Short patch attached. Sample use: db> kill 9 0t500 where '9' is the signal number and '500' is the process id. Dima Dorfman dima@unixfreak.org Index: db_command.c =================================================================== RCS file: /st/src/FreeBSD/src/sys/ddb/db_command.c,v retrieving revision 1.34 diff -u -r1.34 db_command.c --- db_command.c 1999/08/28 00:41:06 1.34 +++ db_command.c 2001/05/08 23:37:59 @@ -36,7 +36,11 @@ */ #include <sys/param.h> #include <sys/linker_set.h> +#include <sys/lock.h> +#include <sys/mutex.h> +#include <sys/proc.h> #include <sys/reboot.h> +#include <sys/signalvar.h> #include <sys/systm.h> #include <sys/cons.h> @@ -61,6 +65,7 @@ static db_cmdfcn_t db_fncall; static db_cmdfcn_t db_gdb; +static db_cmdfcn_t db_kill; /* XXX this is actually forward-static. */ extern struct command db_show_cmds[]; @@ -405,6 +410,7 @@ { "show", 0, 0, db_show_cmds }, { "ps", db_ps, 0, 0 }, { "gdb", db_gdb, 0, 0 }, + { "kill", db_kill, CS_OWN, 0 }, { (char *)0, } }; @@ -558,4 +564,41 @@ db_printf("Next trap will enter %s\n", boothowto & RB_GDB ? "GDB remote protocol mode" : "DDB debugger"); +} + +static void +db_kill(dummy1, dummy2, dummy3, dummy4) + db_expr_t dummy1; + boolean_t dummy2; + db_expr_t dummy3; + char * dummy4; +{ + struct proc *p; + db_expr_t sig, pid; + + if (!db_expression(&sig)) { + db_printf("Missing signal number\n"); + db_flush_lex(); + return; + } + if (!db_expression(&pid)) { + db_printf("Missing process id\n"); + db_flush_lex(); + return; + } + db_skip_to_eol(); + if (sig < 0 || sig > _SIG_MAXSIG) { + db_printf("Signal number out of range\n"); + db_flush_lex(); + return; + } + + p = pfind(pid); + if (p == NULL) { + db_printf("Can't find process with pid %d\n", pid); + db_flush_lex(); + return; + } + psignal(p, sig); + PROC_UNLOCK(p); } To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20010508234354.F0CB03E28>