Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 11 Sep 1996 01:20:03 -0700
From:      Julian Elischer <julian@whistle.com>
To:        current@freebsd.org
Subject:   [HOWTO] Kernel GDB stubs
Message-ID:  <32367633.167EB0E7@whistle.com>

next in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.

--------------794BDF32446B9B3D2781E494
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

I'd like to nominate the crew who got the kernel gdb
stub going, for some sort of "GOD for a day" award.

I've been using it with xxgdb over gdb..
the ability to just dump out structures in the kernel,
and single step with source,
all in differnet windows, etc. etc. is amazing..

I'm almost looking forward for excuses to use it..

today I found 2 bugs in the appletalk code, and cleared up my
understanding of some aspects of the VFS system, found a long-standing
bug in a frame-relay driver, and stopped a DEVFS panic,
all using it..

this is almost TOO easy..
Of course you need 2 machines but I have a little old 486
hanging off the back of my pentium here, and it's great.

I did the regulation config -g MYKERN,
then modified the Makefile to add:

cp kernel kernel.debug
strip -d kernel

The debug kernel is a bit big
-rwxr-xr-x  1 julian  bmann  8783261 Sep 11 00:25 kernel.debug
but you install the stripped one..

in the compile directory I have the following .gdbinit

set remotebaud 9600
file kernel.debug
target remote  /dev/cuaa1

then inthat directory simply run gdb or xxgdb or ddd or tkgdb
or whatever frontend you like.

gdb just sits and awaits a breakpoint or whatever..
don't forget to set 
sysctl -w debug.debugger_on_panic=1
on teh target machine if you want to catch panics
and do <CTL><ALT><ESC> once to get  into the ddb
then "gdb" to set gdb mode, followed by "cont".

or 

Boot: -g

If you have problems, I have the attached patches to sio.c 
to make it work for me though some people don't need these.


bde has another patch he prefers, but you shouldn't have sio0 open for 
anything else or naturally there will be confusion....


julian

--------------794BDF32446B9B3D2781E494
Content-Type: text/plain; charset=us-ascii; name="xx.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="xx.diff"

Index: sio.c
===================================================================
RCS file: /cvs/freebsd/src/sys/i386/isa/sio.c,v
retrieving revision 1.145
diff -c -r1.145 sio.c
*** 1.145	1996/09/06 23:08:05
--- sio.c	1996/09/11 08:16:51
***************
*** 70,75 ****
--- 70,76 ----
  #include <i386/isa/isa.h>
  #include <i386/isa/isa_device.h>
  #include <i386/isa/sioreg.h>
+ #include <machine/cons.h>
  
  #ifdef COM_ESP
  #include <i386/isa/ic/esp.h>
***************
*** 266,271 ****
--- 267,274 ----
  	void	*devfs_token_cuai;
  #endif
  };
+ 	static int cn_initialised = -2;
+ 	struct siocnstate	sp;
  
  /*
   * XXX public functions in drivers should be declared in headers produced
***************
*** 993,998 ****
--- 996,1005 ----
  #else
  	tp = com->tp = &sio_tty[unit];
  #endif
+ 	if( unit == comconsole )
+ 		if ( cn_initialised == -1 )
+ 			cn_initialised = 0;
+ 
  	s = spltty();
  	/*
  	 * We jump to this label after all non-interrupted sleeps to pick
***************
*** 1221,1226 ****
--- 1228,1235 ----
  	com->active_out = FALSE;
  	wakeup(&com->active_out);
  	wakeup(TSA_CARR_ON(tp));	/* restart any wopeners */
+ 	if( unit == comconsole )
+ 		cn_initialised = -1;
  	splx(s);
  }
  
***************
*** 2285,2291 ****
  /*
   * Following are all routines needed for SIO to act as console
   */
- #include <machine/cons.h>
  
  struct siocnstate {
  	u_char	dlbl;
--- 2294,2299 ----
***************
*** 2324,2329 ****
--- 2332,2339 ----
  	int	divisor;
  	Port_t	iobase;
  
+ 	/* -2 = initial -1 = don't bother, 1 = done */
+ 	if((cn_initialised != 0) && (cn_initialised != -2)) return;
  	/*
  	 * Save all the device control registers except the fifo register
  	 * and set our default ones (cs8 -parenb speed=comdefaultrate).
***************
*** 2348,2353 ****
--- 2358,2364 ----
  	 * an interrupt by floating the IRQ line.
  	 */
  	outb(iobase + com_mcr, (sp->mcr & MCR_IENABLE) | MCR_DTR | MCR_RTS);
+ 	cn_initialised++ ;
  }
  
  static void
***************
*** 2356,2361 ****
--- 2367,2373 ----
  {
  	Port_t	iobase;
  
+ 	if(cn_initialised < 0) return;
  	/*
  	 * Restore the device control registers.
  	 */
***************
*** 2370,2375 ****
--- 2382,2388 ----
  	 */
  	outb(iobase + com_mcr, sp->mcr | MCR_DTR | MCR_RTS);
  	outb(iobase + com_ier, sp->ier);
+ 	cn_initialised--;
  }
  
  void
***************
*** 2407,2413 ****
  	int	c;
  	Port_t	iobase;
  	int	s;
- 	struct siocnstate	sp;
  
  	iobase = siocniobase;
  	s = spltty();
--- 2420,2425 ----
***************
*** 2429,2435 ****
  	int	c;
  	Port_t	iobase;
  	int	s;
- 	struct siocnstate	sp;
  
  	iobase = siocniobase;
  	s = spltty();
--- 2441,2446 ----
***************
*** 2448,2454 ****
  	int	c;
  {
  	int	s;
- 	struct siocnstate	sp;
  
  	s = spltty();
  	siocnopen(&sp);
--- 2459,2464 ----

--------------794BDF32446B9B3D2781E494--




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?32367633.167EB0E7>