On Monday 10 March 2003 17:28, Dag-Erling Smorgrav wrote:
> Jun Su <[EMAIL PROTECTED]> writes:
> > 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. :)
>
> This is pointless as it won't work unless gdb is in synch with the
> kernel (since it depends on knowing the layout of struct proc and
> struct linker_file).  Both of these commands can be implemented as
> macros, which will not depend on gdb being in synch with the kernel.
>
> Greg Lehey wrote this ps macro:
>
> define ps
>     set $nproc = nprocs
>     set $aproc = allproc.lh_first
>     set $proc = allproc.lh_first
>     printf "  pid    proc    addr   uid  ppid  pgrp   flag stat comm       
>  wchan\n" while (--$nproc >= 0)
>         set $pptr = $proc.p_pptr
>         if ($pptr == 0)
>            set $pptr = $proc
>         end
>         if ($proc.p_stat)
>             printf "%5d %08x %08x %4d %5d %5d  %06x  %d  %-10s   ", \
>                    $proc.p_pid, $aproc, \
>                    $proc.p_addr, $proc.p_cred->p_ruid, $pptr->p_pid, \
>                    $proc.p_pgrp->pg_id, $proc.p_flag, $proc.p_stat, \
>                    &$proc.p_comm[0]
>             if ($proc.p_wchan)
>                 if ($proc.p_wmesg)
>                     printf "%s ", $proc.p_wmesg
>                 end
>                 printf "%x", $proc.p_wchan
>             end
>             printf "\n"
>         end
>         set $aproc = $proc.p_list.le_next
>         if ($aproc == 0 && $nproc > 0)
>             set $aproc = zombproc
>         end
>         set $proc = $aproc
>     end
> end
>
> document ps
> "ps" -- when kernel debugging, type out a ps-like listing of active
> processes. end
>
> and I've written two variants of kldstat myself, plus a kldload:
>
> end
>
> document kldstat
>   Lists the modules that were loaded when the kernel crashed.
> end
>
> define kldstat-v
>   set $kld = linker_files.tqh_first
>   printf "Id Refs Address    Size     Name\n"
>   while ($kld != 0)
>     printf "%2d %4d 0x%08x %-8x %s\n", \
>       $kld->id, $kld->refs, $kld->address, $kld->size, $kld->filename
>     printf "        Contains modules:\n"
>     printf "                Id Name\n"
>     set $module = $kld->modules.tqh_first
>     while ($module != 0)
>       printf "                %2d %s\n", $module->id, $module->name
>       set $module = $module->link.tqe_next
>     end
>     set $kld = $kld->link.tqe_next
>   end
> end
>
> document kldstat-v
>   Lists modules with full information.
> end
>
> define kldload
>   set $kld = linker_files.tqh_first
>   set $done = 0
>   while ($kld != 0 && $done == 0)
>     if ($kld->filename == $arg0)
>       set $done = 1
>     else
>       set $kld = $kld->link.tqe_next
>     end
>   end
>   if ($done == 1)
>     shell /usr/bin/objdump -h $arg0 | \
>       awk '/ .text/ { print "set \$offset = 0x" $6 }' > .kgdb.temp
>     source .kgdb.temp
>     add-symbol-file $arg0 $kld->address + $offset
>   end
> end
>
> document kldload
>   Loads a module. Arguments are module name and offset of text section.
> end
>
> Note that for kldload to work, you need to know the offset of the text
> section for the module you wish to load (objdump -h will tell you)
>
> Note also that I haven't used any of these macros in a long time, so
> there may be some issues related to KSE or whatnot.
>
> DES

You are so cool. Your macro is better than my code. Thanks.

I think the kernel structure is not changed often. These type of macro can 
help most newbies such as me to enter the freebsd debug easily. It is worth 
to maintain a copy somewhere. (In source tree, it may be great.) I used 
windbg for a long time. it provides many commands to help developer debug. 
This is a good pratice I think. :)

Jun Su


To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-current" in the body of the message

Reply via email to