On Sun, Dec 23, 2012 at 1:34 PM, Justin Mayes <[email protected]> wrote:
> I was looking into kernel debug options and found that trying to build a
> kernel with kgdb option enabled fails.
If no one uses it, it won't keep working. Submitting a patch to fix
the build would be a first step. I suggest trying it both with DDB
and without DDB: those should both work.
> Anyone using the kgdb setup? I can
> use ddb it's just painful to have to manually walk structures to examine
> values. I have moved on to plan B which was to build with option DDB_STRUCT
> and the build is a success but the 'show struct' command always returns
> 'unknown structure' for anything other than mbuf. Anyone have any kernel
> debugging strategies they'd like to share?
DDB_STRUCT works for me for other structures. For example, here's a
session looking at a firefox struct proc:
Stopped at Debugger+0x5: leave
ddb{0}> ps/a
PID COMMAND STRUCT PROC * UAREA * VMSPACE/VM_MAP
16253 firefox 0xfffffe812af09798 0xffff800032dd6000 0xfffffe81305ec1d0
8061 xpdf 0xfffffe81280e1a08 0xffff800032dfe000 0xfffffe81305ecd30
31009 firefox 0xfffffe81280e17a0 0xffff800032df9000 0xfffffe81305ec1d0
5390 firefox 0xfffffe81280e1c70 0xffff800032e0d000 0xfffffe81305ec1d0
10871 less 0xfffffe81280e1068 0xffff800032df4000 0xfffffe81305ece10
28672 vi 0xfffffe8129b0d7a8 0xffff800032e16000 0xfffffe81305ecb70
24081 firefox 0xfffffe81280e12d0 0xffff800032def000 0xfffffe81305ec1d0
29697 firefox 0xfffffe812af09c68 0xffff800032de5000 0xfffffe81305ec1d0
19401 firefox 0xfffffe812af09a00 0xffff800032de0000 0xfffffe81305ec1d0
27330 firefox 0xfffffe8135a2b4f0 0xffff800032ddb000 0xfffffe81305ec1d0
13735 firefox 0xfffffe812af09530 0xffff800032dd1000 0xfffffe81305ec1d0
819 firefox 0xfffffe812af092c8 0xffff800032dcc000 0xfffffe81305ec1d0
13812 firefox 0xfffffe812de71c60 0xffff800032dc2000 0xfffffe81305ec1d0
15769 firefox 0xfffffe812af09060 0xffff800032dc7000 0xfffffe81305ec1d0
2108 firefox 0xfffffe812de719f8 0xffff800032dbd000 0xfffffe81305ec1d0
7957 firefox 0xfffffe812de71790 0xffff800032db8000 0xfffffe81305ec1d0
20128 firefox 0xfffffe812de71528 0xffff800032db3000 0xfffffe81305ec1d0
4339 firefox 0xfffffe812de712c0 0xffff800032da6000 0xfffffe81305ec1d0
20161 firefox 0xfffffe812de71058 0xffff800032da1000 0xfffffe81305ec1d0
4258 firefox 0xfffffe812f591c58 0xffff800032d9c000 0xfffffe81305ec1d0
4495 firefox 0xfffffe812f5919f0 0xffff800032d8f000 0xfffffe81305ec1d0
ddb{0}> show struct
proc 0xfffffe812af09798
struct proc at 0xfffffe812af09798 (616 bytes)
p_runq 16
p_list 16
p_p 8 fffffe81368ad7c8
p_thr_link 16
p_fd 8 fffffe81377d1898
p_vmspace 8 fffffe81305ec1d0
p_sigacts 8 fffffe8136f246c0
p_exitsig 4 0
p_flag 4 4100080
p_spare 1 ef
p_stat 1 3
p_pad1 1 af
p_descfd 1 de
p_pid 4 3f7d
p_hash 16
p_dupfd 4 0
p_thrslpid 8 2309e1800
p_sigwait 4 0
p_estcpu 4 0
p_cpticks 4 0
p_pctcpu 4 0
p_wchan 8 fffffe812af09810
p_sleep_to 40
p_wmesg 8 ffffffff8083585c
p_swtime 4 32
p_slptime 4 e
p_cpu 8 ffff8000001c1000
p_ru 144
p_tu 40
p_rtime 16
p_uticks 4 0
p_sticks 4 0
p_iticks 4 0
p_systrace 8 0
p_siglist 4 0
p_textvp 8 fffffe812e522160
p_emuldata 8 0
p_sigdivert 4 0
p_sigmask 4 0
p_priority 1 32
p_usrpri 1 32
p_comm[17] 1 66 69 72 65 66 6f 78 0 0
0 0 0 0 0 0 0 0
p_emul 8 ffffffff80a4eb00
p_sigstk 24
p_sigcode 8 2034cd000
p_prof_addr 8 0
p_prof_ticks 8 0
p_addr 8 ffff800032dd6000
p_md 16
p_oldmask 4 deafbeef
p_sigval 8 deafbeefdeafbeef
p_sisig 4 deafbeef
p_sicode 4 deafbeef
p_sitrapno 8 deafbeefdeafbeef
p_xstat 2 0
ddb{0}>
As far as other random kernel debugging idea, I've occasionally added
extra counters on code paths and then used "pstat -d d counter_name"
to dump it from userspace, or circular buffers that the kernel
snprintf()'s to and then dumped them with "pstat -d s buffer_name". I
know some debug nasty low-level stuff using qemu or blochs to run the
kernel in emulation where they can stop it and dump memory and
register when it blows up.
Philip Guenther