Update the description of how to load modules in gdb, and separate it from

the section on remote debugging since it also applies to crash dumps.  Thanks
to grog for his gdb macros, which pointed me in the right direction.

Reviewed by:	nik
This commit is contained in:
Dag-Erling Smørgrav 2000-11-15 12:40:05 +00:00
parent b964e8e3e0
commit a43d4233ca
Notes: svn2git 2020-12-08 03:00:23 +00:00
svn path=/head/; revision=8368
3 changed files with 171 additions and 60 deletions

View file

@ -1,7 +1,7 @@
<!--
The FreeBSD Documentation Project
$FreeBSD: doc/en_US.ISO_8859-1/books/handbook/kerneldebug/chapter.sgml,v 1.25 2000/07/14 21:57:34 ben Exp $
$FreeBSD: doc/en_US.ISO_8859-1/books/handbook/kerneldebug/chapter.sgml,v 1.26 2000/11/07 09:08:11 jkoshy Exp $
-->
<chapter id="kerneldebug">
@ -554,33 +554,70 @@ Debugger (msg=0xf01b0383 "Boot flags requested debugger")
full access to the source, running it in gud-mode inside an Emacs window
(which gives you an automatic source code display in another Emacs
window) etc.</para>
</sect1>
<sect1>
<title>Debugging Loadable Modules Using GDB</title>
<para>Remote GDB can also be used to debug LKMs. First build the LKM with
debugging symbols:</para>
<para>When debugging a panic that occurred within a module, or
using remote GDB against a machine that uses dynamic modules,
you need to tell GDB how to obtain symbol information for those
modules.</para>
<screen>&prompt.root; <userinput>cd /usr/src/lkm/linux</userinput>
<para>First, you need to build the module(s) with debugging
information:</para>
<screen>&prompt.root; <userinput>cd /sys/modules/linux</userinput>
&prompt.root; <userinput>make clean; make COPTS=-g</userinput></screen>
<para>Then install this version of the module on the target machine, load
it and use <command>modstat</command> to find out where it was
loaded:</para>
<para>If you are using remote GDB, you can run
<command>kldstat</command> on the target machine to find out
where the module was loaded:</para>
<screen>&prompt.root; <userinput>linux</userinput>
&prompt.root; <userinput>modstat</userinput>
Type Id Off Loadaddr Size Info Rev Module Name
EXEC 0 4 f5109000 001c f510f010 1 linux_mod</screen>
<para>Take the load address of the module and add 0x20 (probably to
account for the a.out header). This is the address that the module code
was relocated to. Use the <command>add-symbol-file</command> command in
GDB to tell the debugger about the module:</para>
<screen>&prompt.root; <userinput>kldstat</userinput>
Id Refs Address Size Name
1 4 0xc0100000 1c1678 kernel
2 1 0xc0a9e000 6000 linprocfs.ko
3 1 0xc0ad7000 2000 warp_saver.ko
4 1 0xc0adc000 11000 linux.ko
</screen>
<screen><prompt>(kgdb)</prompt> <userinput>add-symbol-file /usr/src/lkm/linux/linux_mod.o 0xf5109020</userinput>
add symbol table from file "/usr/src/lkm/linux/linux_mod.o" at
text_addr = 0xf5109020? (y or n) <userinput>y</userinput>
<para>If you are debugging a crash dump, you'll need to walk the
<literal>linker_files</literal> list, starting at
<literal>linker_files->tqh_first</literal> and following the
<literal>link.tqe_next</literal> pointers until you find the
entry with the <literal>filename</literal> you are looking for.
The <literal>address</literal> member of that entry is the load
address of the module.</para>
<para>Next, you need to find out the offset of the text section
within the module:</para>
<screen>&prompt.root; <userinput>objdump --section-headers /sys/modules/linux/linux.ko | grep text</userinput>
3 .rel.text 000016e0 000038e0 000038e0 000038e0 2**2
10 .text 00007f34 000062d0 000062d0 000062d0 2**2</screen>
<para>The one you want is the <literal>.text</literal> section,
section 10 in the above example. The fourth numerical field
(sixth field overall) is the offset in hex of the text section
within the file (0x62d0 in our example). Add this to the load
address reported by <command>kldstat</command> to obtain the
address of the module text in memory.</para>
<para>Take the load address of the module (as reported by
<command>kldstat</command>) and add the offset of the text
section within the module (0x62d0 + 0xc0adc000 = c0ae22d0 in our
example). This is the address that the module code was
relocated to. Use the <command>add-symbol-file</command>
command in GDB to tell the debugger about the module:</para>
<screen><prompt>(kgdb)</prompt> <userinput>add-symbol-file /sys/modules/linux/linux.ko 0xc0ae22d0</userinput>
add symbol table from file "/sys/modules/linux/linux.ko" at text_addr = 0xc0ae22d0?
(y or n) <userinput>y</userinput>
Reading symbols from /sys/modules/linux/linux.ko...done.
<prompt>(kgdb)</prompt></screen>
<para>You now have access to all the symbols in the LKM.</para>
<para>You now have access to all the symbols in the module.</para>
</sect1>
<sect1>

View file

@ -1,7 +1,7 @@
<!--
The FreeBSD Documentation Project
$FreeBSD: doc/en_US.ISO_8859-1/books/handbook/kerneldebug/chapter.sgml,v 1.25 2000/07/14 21:57:34 ben Exp $
$FreeBSD: doc/en_US.ISO_8859-1/books/handbook/kerneldebug/chapter.sgml,v 1.26 2000/11/07 09:08:11 jkoshy Exp $
-->
<chapter id="kerneldebug">
@ -554,33 +554,70 @@ Debugger (msg=0xf01b0383 "Boot flags requested debugger")
full access to the source, running it in gud-mode inside an Emacs window
(which gives you an automatic source code display in another Emacs
window) etc.</para>
</sect1>
<sect1>
<title>Debugging Loadable Modules Using GDB</title>
<para>Remote GDB can also be used to debug LKMs. First build the LKM with
debugging symbols:</para>
<para>When debugging a panic that occurred within a module, or
using remote GDB against a machine that uses dynamic modules,
you need to tell GDB how to obtain symbol information for those
modules.</para>
<screen>&prompt.root; <userinput>cd /usr/src/lkm/linux</userinput>
<para>First, you need to build the module(s) with debugging
information:</para>
<screen>&prompt.root; <userinput>cd /sys/modules/linux</userinput>
&prompt.root; <userinput>make clean; make COPTS=-g</userinput></screen>
<para>Then install this version of the module on the target machine, load
it and use <command>modstat</command> to find out where it was
loaded:</para>
<para>If you are using remote GDB, you can run
<command>kldstat</command> on the target machine to find out
where the module was loaded:</para>
<screen>&prompt.root; <userinput>linux</userinput>
&prompt.root; <userinput>modstat</userinput>
Type Id Off Loadaddr Size Info Rev Module Name
EXEC 0 4 f5109000 001c f510f010 1 linux_mod</screen>
<para>Take the load address of the module and add 0x20 (probably to
account for the a.out header). This is the address that the module code
was relocated to. Use the <command>add-symbol-file</command> command in
GDB to tell the debugger about the module:</para>
<screen>&prompt.root; <userinput>kldstat</userinput>
Id Refs Address Size Name
1 4 0xc0100000 1c1678 kernel
2 1 0xc0a9e000 6000 linprocfs.ko
3 1 0xc0ad7000 2000 warp_saver.ko
4 1 0xc0adc000 11000 linux.ko
</screen>
<screen><prompt>(kgdb)</prompt> <userinput>add-symbol-file /usr/src/lkm/linux/linux_mod.o 0xf5109020</userinput>
add symbol table from file "/usr/src/lkm/linux/linux_mod.o" at
text_addr = 0xf5109020? (y or n) <userinput>y</userinput>
<para>If you are debugging a crash dump, you'll need to walk the
<literal>linker_files</literal> list, starting at
<literal>linker_files->tqh_first</literal> and following the
<literal>link.tqe_next</literal> pointers until you find the
entry with the <literal>filename</literal> you are looking for.
The <literal>address</literal> member of that entry is the load
address of the module.</para>
<para>Next, you need to find out the offset of the text section
within the module:</para>
<screen>&prompt.root; <userinput>objdump --section-headers /sys/modules/linux/linux.ko | grep text</userinput>
3 .rel.text 000016e0 000038e0 000038e0 000038e0 2**2
10 .text 00007f34 000062d0 000062d0 000062d0 2**2</screen>
<para>The one you want is the <literal>.text</literal> section,
section 10 in the above example. The fourth numerical field
(sixth field overall) is the offset in hex of the text section
within the file (0x62d0 in our example). Add this to the load
address reported by <command>kldstat</command> to obtain the
address of the module text in memory.</para>
<para>Take the load address of the module (as reported by
<command>kldstat</command>) and add the offset of the text
section within the module (0x62d0 + 0xc0adc000 = c0ae22d0 in our
example). This is the address that the module code was
relocated to. Use the <command>add-symbol-file</command>
command in GDB to tell the debugger about the module:</para>
<screen><prompt>(kgdb)</prompt> <userinput>add-symbol-file /sys/modules/linux/linux.ko 0xc0ae22d0</userinput>
add symbol table from file "/sys/modules/linux/linux.ko" at text_addr = 0xc0ae22d0?
(y or n) <userinput>y</userinput>
Reading symbols from /sys/modules/linux/linux.ko...done.
<prompt>(kgdb)</prompt></screen>
<para>You now have access to all the symbols in the LKM.</para>
<para>You now have access to all the symbols in the module.</para>
</sect1>
<sect1>

View file

@ -1,7 +1,7 @@
<!--
The FreeBSD Documentation Project
$FreeBSD: doc/en_US.ISO_8859-1/books/handbook/kerneldebug/chapter.sgml,v 1.25 2000/07/14 21:57:34 ben Exp $
$FreeBSD: doc/en_US.ISO_8859-1/books/handbook/kerneldebug/chapter.sgml,v 1.26 2000/11/07 09:08:11 jkoshy Exp $
-->
<chapter id="kerneldebug">
@ -554,33 +554,70 @@ Debugger (msg=0xf01b0383 "Boot flags requested debugger")
full access to the source, running it in gud-mode inside an Emacs window
(which gives you an automatic source code display in another Emacs
window) etc.</para>
</sect1>
<sect1>
<title>Debugging Loadable Modules Using GDB</title>
<para>Remote GDB can also be used to debug LKMs. First build the LKM with
debugging symbols:</para>
<para>When debugging a panic that occurred within a module, or
using remote GDB against a machine that uses dynamic modules,
you need to tell GDB how to obtain symbol information for those
modules.</para>
<screen>&prompt.root; <userinput>cd /usr/src/lkm/linux</userinput>
<para>First, you need to build the module(s) with debugging
information:</para>
<screen>&prompt.root; <userinput>cd /sys/modules/linux</userinput>
&prompt.root; <userinput>make clean; make COPTS=-g</userinput></screen>
<para>Then install this version of the module on the target machine, load
it and use <command>modstat</command> to find out where it was
loaded:</para>
<para>If you are using remote GDB, you can run
<command>kldstat</command> on the target machine to find out
where the module was loaded:</para>
<screen>&prompt.root; <userinput>linux</userinput>
&prompt.root; <userinput>modstat</userinput>
Type Id Off Loadaddr Size Info Rev Module Name
EXEC 0 4 f5109000 001c f510f010 1 linux_mod</screen>
<para>Take the load address of the module and add 0x20 (probably to
account for the a.out header). This is the address that the module code
was relocated to. Use the <command>add-symbol-file</command> command in
GDB to tell the debugger about the module:</para>
<screen>&prompt.root; <userinput>kldstat</userinput>
Id Refs Address Size Name
1 4 0xc0100000 1c1678 kernel
2 1 0xc0a9e000 6000 linprocfs.ko
3 1 0xc0ad7000 2000 warp_saver.ko
4 1 0xc0adc000 11000 linux.ko
</screen>
<screen><prompt>(kgdb)</prompt> <userinput>add-symbol-file /usr/src/lkm/linux/linux_mod.o 0xf5109020</userinput>
add symbol table from file "/usr/src/lkm/linux/linux_mod.o" at
text_addr = 0xf5109020? (y or n) <userinput>y</userinput>
<para>If you are debugging a crash dump, you'll need to walk the
<literal>linker_files</literal> list, starting at
<literal>linker_files->tqh_first</literal> and following the
<literal>link.tqe_next</literal> pointers until you find the
entry with the <literal>filename</literal> you are looking for.
The <literal>address</literal> member of that entry is the load
address of the module.</para>
<para>Next, you need to find out the offset of the text section
within the module:</para>
<screen>&prompt.root; <userinput>objdump --section-headers /sys/modules/linux/linux.ko | grep text</userinput>
3 .rel.text 000016e0 000038e0 000038e0 000038e0 2**2
10 .text 00007f34 000062d0 000062d0 000062d0 2**2</screen>
<para>The one you want is the <literal>.text</literal> section,
section 10 in the above example. The fourth numerical field
(sixth field overall) is the offset in hex of the text section
within the file (0x62d0 in our example). Add this to the load
address reported by <command>kldstat</command> to obtain the
address of the module text in memory.</para>
<para>Take the load address of the module (as reported by
<command>kldstat</command>) and add the offset of the text
section within the module (0x62d0 + 0xc0adc000 = c0ae22d0 in our
example). This is the address that the module code was
relocated to. Use the <command>add-symbol-file</command>
command in GDB to tell the debugger about the module:</para>
<screen><prompt>(kgdb)</prompt> <userinput>add-symbol-file /sys/modules/linux/linux.ko 0xc0ae22d0</userinput>
add symbol table from file "/sys/modules/linux/linux.ko" at text_addr = 0xc0ae22d0?
(y or n) <userinput>y</userinput>
Reading symbols from /sys/modules/linux/linux.ko...done.
<prompt>(kgdb)</prompt></screen>
<para>You now have access to all the symbols in the LKM.</para>
<para>You now have access to all the symbols in the module.</para>
</sect1>
<sect1>