Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 8 Mar 2003 12:24:53 +0800
From:      Jun Su <JunSu@gmx.net>
To:        freebsd-current@freebsd.org
Subject:   GDB kernel debug new command
Message-ID:  <200303081224.53273.JunSu@gmx.net>

next in thread | raw e-mail | index | archive | help
Hi All,

To help myself more easily check the kernel dump, I added two new command. One 
is ps, the other is kldstat. I know we can print the kernel data manually to 
get the same information. I still think this is useful. This can help the 
newbies to get the information without many knowledge about the kernel. This 
also can help the experienced user to get the data more quickly. 

Here is the new file. Just put it in /usr/src/gnu/usr.bin/binutils/gdb. And 
add the file to Makefile. Please give me some comments if this is garbage. :)

Jun Su


--/usr/src/gnu/usr.bin/binutils/gdb/fbsd-kgdbpack.c--
#include "fbsd-kgdb.h"

#include "defs.h"
#include "command.h"
#include "symtab.h"

#define _KERNEL
#include <sys/queue.h>
#include <sys/linker.h>
#undef _KERNEL
#include <sys/proc.h>

static void
kgdbpack_kldstat_cmd(char* arg, int from_tty)
{
  CORE_ADDR allfile_addr;
  CORE_ADDR startfile;
  struct minimal_symbol *sym;
  char buf[sizeof(struct linker_file)];
  char namebuf[256];
    
  sym = lookup_minimal_symbol("linker_files",NULL,NULL);
  if (!sym)
    error ("can not find the linker_files symbosl.\n");
  
  allfile_addr = SYMBOL_VALUE_ADDRESS(sym);
  namebuf[255]=0;
  
  struct linker_file *lf = (struct linker_file *)buf;
 
  target_read_memory(allfile_addr, &startfile, sizeof(startfile));
  printf("Id\tRefs\tAddress   \tSize\tName\n");     
  while(startfile)
    {

      target_read_memory(startfile, buf, sizeof(struct linker_file));
      target_read_memory((int)lf->filename, namebuf, 254);
 
      printf ("%d\t%d\t0x%8X\t%x\t%s\n", lf->id, lf->refs, lf->address, 
lf->size, namebuf);
      startfile = (CORE_ADDR)lf->link.tqe_next;
   } 
 
  return;
}

static void 
kgdbpack_ps_cmd(char* argv, int from_tty)
{
  CORE_ADDR allproc_addr;
  CORE_ADDR procstart;
  struct minimal_symbol *sym;
  sym = lookup_minimal_symbol("allproc",NULL,NULL);
  if (!sym)
    error ("No symbol allproc found.");
  allproc_addr = SYMBOL_VALUE_ADDRESS(sym);
  target_read_memory(allproc_addr, &procstart, sizeof(int));

  char buf[sizeof(struct proc)];

  struct proc *p = (struct proc*)buf;
  printf("ADDRESS\tPID\tSTAT\tCOMMAND\n");
  while (procstart) {
    target_read_memory(procstart, buf, sizeof(struct proc));
    printf("%08x\t%d\t0\t%s\n", procstart, p->p_pid, p->p_comm);
    procstart = p->p_list.le_next;
  }
   
}


void
_initialize_kgdbpack()
{
    add_com ("kldstat", class_obscure, kgdbpack_kldstat_cmd, "KLDSTAT cmd 
clone");
    add_com ("ps", class_obscure, kgdbpack_ps_cmd, "PS cmd clone");
}


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?200303081224.53273.JunSu>