Skip site navigation (1)Skip section navigation (2)
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>