~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/Documentation/translations/zh_CN/dev-tools/gdb-kernel-debugging.rst

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 .. highlight:: none
  2 
  3 .. include:: ../disclaimer-zh_CN.rst
  4 
  5 :Original: Documentation/dev-tools/gdb-kernel-debugging.rst
  6 :Translator: 高超 gao chao <gaochao49@huawei.com>
  7 
  8 通过gdb调试内核和模块
  9 =====================
 10 
 11 Kgdb内核调试器、QEMU等虚拟机管理程序或基于JTAG的硬件接口,支持在运行时使用gdb
 12 调试Linux内核及其模块。Gdb提供了一个强大的python脚本接口,内核也提供了一套
 13 辅助脚本以简化典型的内核调试步骤。本文档为如何启用和使用这些脚本提供了一个简要的教程。
 14 此教程基于QEMU/KVM虚拟机,但文中示例也适用于其他gdb stub。
 15 
 16 
 17 环境配置要求
 18 ------------
 19 
 20 - gdb 7.2+ (推荐版本: 7.4+) 且开启python支持 (通常发行版上都已支持)
 21 
 22 设置
 23 ----
 24 
 25 - 创建一个QEMU/KVM的linux虚拟机(详情请参考 www.linux-kvm.org 和 www.qemu.org )。
 26   对于交叉开发,https://landley.net/aboriginal/bin 提供了一些镜像和工具链,
 27   可以帮助搭建交叉开发环境。
 28 
 29 - 编译内核时开启CONFIG_GDB_SCRIPTS,关闭CONFIG_DEBUG_INFO_REDUCED。
 30   如果架构支持CONFIG_FRAME_POINTER,请保持开启。
 31 
 32 - 在guest环境上安装该内核。如有必要,通过在内核command line中添加“nokaslr”来关闭KASLR。
 33   此外,QEMU允许通过-kernel、-append、-initrd这些命令行选项直接启动内核。
 34   但这通常仅在不依赖内核模块时才有效。有关此模式的更多详细信息,请参阅QEMU文档。
 35   在这种情况下,如果架构支持KASLR,应该在禁用CONFIG_RANDOMIZE_BASE的情况下构建内核。
 36 
 37 - 构建gdb脚本(适用于内核v5.1版本及以上)
 38 
 39     make scripts_gdb
 40 
 41 - 启用QEMU/KVM的gdb stub,可以通过如下方式实现
 42 
 43     - 在VM启动时,通过在QEMU命令行中添加“-s”参数
 44 
 4546 
 47     - 在运行时通过从QEMU监视控制台发送“gdbserver”
 48 
 49 - 切换到/path/to/linux-build(内核源码编译)目录
 50 
 51 - 启动gdb:gdb vmlinux
 52 
 53   注意:某些发行版可能会将gdb脚本的自动加载限制在已知的安全目录中。
 54   如果gdb报告拒绝加载vmlinux-gdb.py(相关命令找不到),请将::
 55 
 56     add-auto-load-safe-path /path/to/linux-build
 57 
 58   添加到~/.gdbinit。更多详细信息,请参阅gdb帮助信息。
 59 
 60 - 连接到已启动的guest环境::
 61 
 62     (gdb) target remote :1234
 63 
 64 
 65 使用Linux提供的gdb脚本的示例
 66 ----------------------------
 67 
 68 - 加载模块(以及主内核)符号::
 69 
 70     (gdb) lx-symbols
 71     loading vmlinux
 72     scanning for modules in /home/user/linux/build
 73     loading @0xffffffffa0020000: /home/user/linux/build/net/netfilter/xt_tcpudp.ko
 74     loading @0xffffffffa0016000: /home/user/linux/build/net/netfilter/xt_pkttype.ko
 75     loading @0xffffffffa0002000: /home/user/linux/build/net/netfilter/xt_limit.ko
 76     loading @0xffffffffa00ca000: /home/user/linux/build/net/packet/af_packet.ko
 77     loading @0xffffffffa003c000: /home/user/linux/build/fs/fuse/fuse.ko
 78     ...
 79     loading @0xffffffffa0000000: /home/user/linux/build/drivers/ata/ata_generic.ko
 80 
 81 - 对一些尚未加载的模块中的函数函数设置断点,例如::
 82 
 83     (gdb) b btrfs_init_sysfs
 84     Function "btrfs_init_sysfs" not defined.
 85     Make breakpoint pending on future shared library load? (y or [n]) y
 86     Breakpoint 1 (btrfs_init_sysfs) pending.
 87 
 88 - 继续执行::
 89 
 90     (gdb) c
 91 
 92 - 加载模块并且能观察到正在加载的符号以及断点命中::
 93 
 94     loading @0xffffffffa0034000: /home/user/linux/build/lib/libcrc32c.ko
 95     loading @0xffffffffa0050000: /home/user/linux/build/lib/lzo/lzo_compress.ko
 96     loading @0xffffffffa006e000: /home/user/linux/build/lib/zlib_deflate/zlib_deflate.ko
 97     loading @0xffffffffa01b1000: /home/user/linux/build/fs/btrfs/btrfs.ko
 98 
 99     Breakpoint 1, btrfs_init_sysfs () at /home/user/linux/fs/btrfs/sysfs.c:36
100     36              btrfs_kset = kset_create_and_add("btrfs", NULL, fs_kobj);
101 
102 - 查看内核的日志缓冲区::
103 
104     (gdb) lx-dmesg
105     [     0.000000] Initializing cgroup subsys cpuset
106     [     0.000000] Initializing cgroup subsys cpu
107     [     0.000000] Linux version 3.8.0-rc4-dbg+ (...
108     [     0.000000] Command line: root=/dev/sda2 resume=/dev/sda1 vga=0x314
109     [     0.000000] e820: BIOS-provided physical RAM map:
110     [     0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009fbff] usable
111     [     0.000000] BIOS-e820: [mem 0x000000000009fc00-0x000000000009ffff] reserved
112     ....
113 
114 - 查看当前task struct结构体的字段(仅x86和arm64支持)::
115 
116     (gdb) p $lx_current().pid
117     $1 = 4998
118     (gdb) p $lx_current().comm
119     $2 = "modprobe\000\000\000\000\000\000\000"
120 
121 - 对当前或指定的CPU使用per-cpu函数::
122 
123     (gdb) p $lx_per_cpu("runqueues").nr_running
124     $3 = 1
125     (gdb) p $lx_per_cpu("runqueues", 2).nr_running
126     $4 = 0
127 
128 - 使用container_of查看更多hrtimers信息::
129 
130     (gdb) set $next = $lx_per_cpu("hrtimer_bases").clock_base[0].active.next
131     (gdb) p *$container_of($next, "struct hrtimer", "node")
132     $5 = {
133       node = {
134         node = {
135           __rb_parent_color = 18446612133355256072,
136           rb_right = 0x0 <irq_stack_union>,
137           rb_left = 0x0 <irq_stack_union>
138         },
139         expires = {
140           tv64 = 1835268000000
141         }
142       },
143       _softexpires = {
144         tv64 = 1835268000000
145       },
146       function = 0xffffffff81078232 <tick_sched_timer>,
147       base = 0xffff88003fd0d6f0,
148       state = 1,
149       start_pid = 0,
150       start_site = 0xffffffff81055c1f <hrtimer_start_range_ns+20>,
151       start_comm = "swapper/2\000\000\000\000\000\000"
152     }
153 
154 
155 命令和辅助调试功能列表
156 ----------------------
157 
158 命令和辅助调试功能可能会随着时间的推移而改进,此文显示的是初始版本的部分示例::
159 
160  (gdb) apropos lx
161  function lx_current -- Return current task
162  function lx_module -- Find module by name and return the module variable
163  function lx_per_cpu -- Return per-cpu variable
164  function lx_task_by_pid -- Find Linux task by PID and return the task_struct variable
165  function lx_thread_info -- Calculate Linux thread_info from task variable
166  lx-dmesg -- Print Linux kernel log buffer
167  lx-lsmod -- List currently loaded modules
168  lx-symbols -- (Re-)load symbols of Linux kernel and currently loaded modules
169 
170 可以通过“help <command-name>”或“help function <function-name>”命令
171 获取指定命令或指定调试功能的更多详细信息。

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php