All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jan Kiszka <jan.kiszka@siemens.com>
To: Andrew Morton <akpm@linux-foundation.org>, linux-kernel@vger.kernel.org
Cc: Jason Wessel <jason.wessel@windriver.com>,
	kgdb-bugreport@lists.sourceforge.net,
	Andi Kleen <andi@firstfloor.org>, Tom Tromey <tromey@redhat.com>,
	Ben Widawsky <ben@bwidawsk.net>, Borislav Petkov <bp@alien8.de>,
	Rob Landley <rob@landley.net>,
	linux-doc@vger.kernel.org
Subject: [PATCH v6 20/20] scripts/gdb: Add basic documentation
Date: Wed, 06 Feb 2013 10:23:08 +0100	[thread overview]
Message-ID: <511220FC.3090200@siemens.com> (raw)
In-Reply-To: <adb8ca13259fed849a5cabc66303d495edea03f3.1359463075.git.jan.kiszka@siemens.com>

CC: Rob Landley <rob@landley.net>
CC: linux-doc@vger.kernel.org
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---

Just to close the request Boris had regarding help on the commands.

Changes in v6:
 - explain how to obtain help on commands and functions
 - minor wording fixes

 Documentation/gdb-kernel-debugging.txt |  158 ++++++++++++++++++++++++++++++++
 1 files changed, 158 insertions(+), 0 deletions(-)
 create mode 100644 Documentation/gdb-kernel-debugging.txt

diff --git a/Documentation/gdb-kernel-debugging.txt b/Documentation/gdb-kernel-debugging.txt
new file mode 100644
index 0000000..1b5b3da
--- /dev/null
+++ b/Documentation/gdb-kernel-debugging.txt
@@ -0,0 +1,158 @@
+Debugging kernel and modules via gdb
+====================================
+
+The kernel debugger kgdb, hypervisors like QEMU or JTAG-based hardware
+interfaces allow to debug the Linux kernel and its modules during runtime
+using gdb. Gdb comes with a powerful scripting interface for python. The
+kernel provides a collection of helper scripts that can simplify typical
+kernel debugging steps. This is a short tutorial about how to enable and use
+them. It focuses on QEMU/KVM virtual machines as target, but the examples can
+be transferred to the other gdb stubs as well.
+
+
+Requirements
+------------
+
+ o gdb 7.1+ (recommended: 7.3+) with python support enabled (typically true
+   for distributions)
+
+
+Setup
+-----
+
+ o Create a virtual Linux machine for QEMU/KVM (see www.linux-kvm.org and
+   www.qemu.org for more details)
+
+ o Build the kernel with CONFIG_DEBUG_INFO enabled, but leave
+   CONFIG_DEBUG_INFO_REDUCED off
+
+ o Install that kernel on the guest.
+
+   Alternatively, QEMU allows to boot the kernel directly using -kernel,
+   -append, -initrd command line switches. This is generally only useful if
+   you do not depend on modules. See QEMU documentation for more details on
+   this mode.
+
+ o Enable the gdb stub of QEMU/KVM, either
+    - at VM startup time by appending "-s" to the QEMU command line
+   or
+    - during runtime by issuing "gdbserver" from the QEMU monitor
+      console
+
+ o cd /path/to/linux-build
+
+ o Start gdb: gdb vmlinux
+
+   Note: Some distros may restrict auto-loading of gdb scripts to known safe
+   directories. In case gdb reports to refuse loading vmlinux-gdb.py, add
+
+    add-add-auto-load-safe-path /path/to/linux-build
+
+   to ~/.gdbinit. See gdb help for more details.
+
+ o Attach to the booted guest:
+    (gdb) target remote :1234
+
+
+Examples of using the Linux-provided gdb helpers
+------------------------------------------------
+
+ o Load module (and main kernel) symbols:
+    (gdb) lx-symbols
+    loading vmlinux
+    scanning for modules in /home/user/linux/build
+    loading @0xffffffffa0020000: /home/user/linux/build/net/netfilter/xt_tcpudp.ko
+    loading @0xffffffffa0016000: /home/user/linux/build/net/netfilter/xt_pkttype.ko
+    loading @0xffffffffa0002000: /home/user/linux/build/net/netfilter/xt_limit.ko
+    loading @0xffffffffa00ca000: /home/user/linux/build/net/packet/af_packet.ko
+    loading @0xffffffffa003c000: /home/user/linux/build/fs/fuse/fuse.ko
+    ...
+    loading @0xffffffffa0000000: /home/user/linux/build/drivers/ata/ata_generic.ko
+
+ o Set a breakpoint on some not yet loaded module function, e.g.:
+    (gdb) b btrfs_init_sysfs
+    Function "btrfs_init_sysfs" not defined.
+    Make breakpoint pending on future shared library load? (y or [n]) y
+    Breakpoint 1 (btrfs_init_sysfs) pending.
+
+ o Continue the target
+    (gdb) c
+
+ o Load the module on the target and watch the symbols being loaded as well as
+   the breakpoint hit:
+    loading @0xffffffffa0034000: /home/user/linux/build/lib/libcrc32c.ko
+    loading @0xffffffffa0050000: /home/user/linux/build/lib/lzo/lzo_compress.ko
+    loading @0xffffffffa006e000: /home/user/linux/build/lib/zlib_deflate/zlib_deflate.ko
+    loading @0xffffffffa01b1000: /home/user/linux/build/fs/btrfs/btrfs.ko
+
+    Breakpoint 1, btrfs_init_sysfs () at /home/user/linux/fs/btrfs/sysfs.c:36
+    36              btrfs_kset = kset_create_and_add("btrfs", NULL, fs_kobj);
+
+ o Dump the log buffer of the target kernel:
+    (gdb) lx-dmesg
+    [     0.000000] Initializing cgroup subsys cpuset
+    [     0.000000] Initializing cgroup subsys cpu
+    [     0.000000] Linux version 3.8.0-rc4-dbg+ (...
+    [     0.000000] Command line: root=/dev/sda2 resume=/dev/sda1 vga=0x314
+    [     0.000000] e820: BIOS-provided physical RAM map:
+    [     0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009fbff] usable
+    [     0.000000] BIOS-e820: [mem 0x000000000009fc00-0x000000000009ffff] reserved
+    ....
+
+ o Examine fields of the current task struct:
+    (gdb) p $lx_current().pid
+    $1 = 4998
+    (gdb) p $lx_current().comm
+    $2 = "modprobe\000\000\000\000\000\000\000"
+
+ o Make use of the per-cpu function for the current or a specified CPU:
+    (gdb) p $lx_per_cpu("runqueues").nr_running
+    $3 = 1
+    (gdb) p $lx_per_cpu("runqueues", 2).nr_running
+    $4 = 0
+
+ o Dig into hrtimers using the container_of helper:
+    (gdb) set $next = $lx_per_cpu("hrtimer_bases").clock_base[0].active.next
+    (gdb) p *$container_of($next, "struct hrtimer", "node")
+    $5 = {
+      node = {
+        node = {
+          __rb_parent_color = 18446612133355256072,
+          rb_right = 0x0 <irq_stack_union>,
+          rb_left = 0x0 <irq_stack_union>
+        },
+        expires = {
+          tv64 = 1835268000000
+        }
+      },
+      _softexpires = {
+        tv64 = 1835268000000
+      },
+      function = 0xffffffff81078232 <tick_sched_timer>,
+      base = 0xffff88003fd0d6f0,
+      state = 1,
+      start_pid = 0,
+      start_site = 0xffffffff81055c1f <hrtimer_start_range_ns+20>,
+      start_comm = "swapper/2\000\000\000\000\000\000"
+    }
+
+
+List of commands and functions
+------------------------------
+
+The number of commands and convenience functions may evolve over the time,
+this is just a snapshot of the initial version:
+
+ (gdb) apropos lx
+ function lx_current -- Return current task
+ function lx_module -- Find module by name and return the module variable
+ function lx_modvar -- Return global variable of a module
+ function lx_per_cpu -- Return per-cpu variable
+ function lx_task_by_pid -- Find Linux task by PID and return the task_struct variable
+ function lx_thread_info -- Calculate Linux thread_info from task variable
+ lx-dmesg -- Print Linux kernel log buffer
+ lx-lsmod -- List currently loaded modules
+ lx-symbols -- (Re-)load symbols of Linux kernel and currently loaded modules
+
+Detailed help can be obtained via "help <command-name>" for commands and "help
+function <function-name>" for convenience functions.
-- 
1.7.3.4

  reply	other threads:[~2013-02-06  9:23 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-01-29 12:37 [PATCH v5 00/20] Add gdb python scripts as kernel debugging helpers Jan Kiszka
2013-01-29 12:37 ` Jan Kiszka
2013-01-29 12:37 ` [PATCH v5 01/20] scripts/gdb: Add infrastructure Jan Kiszka
2013-02-13 21:43   ` Tom Tromey
2013-01-29 12:37 ` [PATCH v5 02/20] scripts/gdb: Add cache for type objects Jan Kiszka
2013-01-29 12:37 ` [PATCH v5 03/20] scripts/gdb: Add container_of helper and convenience function Jan Kiszka
2013-01-29 12:37 ` [PATCH v5 04/20] scripts/gdb: Add module iteration helper Jan Kiszka
2013-01-29 12:37 ` [PATCH v5 05/20] scripts/gdb: Add lx-symbols command Jan Kiszka
2013-02-14 15:40   ` Tom Tromey
2013-02-14 15:48     ` Jan Kiszka
2013-01-29 12:37 ` [PATCH v5 06/20] scripts/gdb: Add internal helper and convenience function to look up a module Jan Kiszka
2013-01-29 12:37 ` [PATCH v5 07/20] scripts/gdb: Add lx_modvar convenience function Jan Kiszka
2013-01-29 12:37 ` [PATCH v5 08/20] scripts/gdb: Add get_target_endianness helper Jan Kiszka
2013-01-29 12:37 ` [PATCH v5 09/20] scripts/gdb: Add read_u16/32/64 helpers Jan Kiszka
2013-01-29 12:37 ` [PATCH v5 10/20] scripts/gdb: Add lx-dmesg command Jan Kiszka
2013-01-29 12:37 ` [PATCH v5 11/20] scripts/gdb: Add task iteration helper Jan Kiszka
2013-01-29 12:37 ` [PATCH v5 12/20] scripts/gdb: Add helper and convenience function to look up tasks Jan Kiszka
2013-01-29 12:37 ` [PATCH v5 13/20] scripts/gdb: Add is_target_arch helper Jan Kiszka
2013-02-13 21:38   ` Tom Tromey
2013-01-29 12:37 ` [PATCH v5 14/20] scripts/gdb: Add internal helper and convenience function to retrieve thread_info Jan Kiszka
2013-01-29 12:37   ` Jan Kiszka
2013-01-29 13:59   ` [PATCH v5 14/20] scripts/gdb: Add internal helper and convenience function to retrieve thread_in Borislav Petkov
2013-01-29 13:59     ` [PATCH v5 14/20] scripts/gdb: Add internal helper and convenience function to retrieve thread_info Borislav Petkov
2013-01-29 12:37 ` [PATCH v5 15/20] scripts/gdb: Add get_gdbserver_type helper Jan Kiszka
2013-01-29 12:37 ` [PATCH v5 16/20] scripts/gdb: Add internal helper and convenience function for per-cpu lookup Jan Kiszka
2013-01-29 12:37   ` Jan Kiszka
2013-01-29 13:51   ` Borislav Petkov
2013-01-29 13:51     ` Borislav Petkov
2013-01-29 13:56     ` Jan Kiszka
2013-01-29 13:56       ` Jan Kiszka
2013-01-29 14:12       ` Borislav Petkov
2013-01-29 14:12         ` Borislav Petkov
2013-01-29 14:25         ` Jan Kiszka
2013-01-29 14:25           ` Jan Kiszka
2013-01-29 12:38 ` [PATCH v5 17/20] scripts/gdb: Add lx_current convenience function Jan Kiszka
2013-01-29 12:38 ` [PATCH v5 18/20] scripts/gdb: Add helper to iterate over CPU masks Jan Kiszka
2013-01-29 12:38 ` [PATCH v5 19/20] scripts/gdb: Add lx-lsmod command Jan Kiszka
2013-01-29 12:38 ` [PATCH v5 20/20] scripts/gdb: Add basic documentation Jan Kiszka
2013-02-06  9:23   ` Jan Kiszka [this message]
2013-02-09 16:15   ` Rob Landley
2013-01-29 14:15 ` [PATCH v5 00/20] Add gdb python scripts as kernel debugging helpers Borislav Petkov
2013-01-29 14:15   ` Borislav Petkov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=511220FC.3090200@siemens.com \
    --to=jan.kiszka@siemens.com \
    --cc=akpm@linux-foundation.org \
    --cc=andi@firstfloor.org \
    --cc=ben@bwidawsk.net \
    --cc=bp@alien8.de \
    --cc=jason.wessel@windriver.com \
    --cc=kgdb-bugreport@lists.sourceforge.net \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=rob@landley.net \
    --cc=tromey@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.