~ [ 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 ] ~

Diff markup

Differences between /Documentation/translations/zh_CN/dev-tools/gdb-kernel-debugging.rst (Version linux-6.12-rc7) and /Documentation/translations/zh_CN/dev-tools/gdb-kernel-debugging.rst (Version linux-6.5.13)


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

~ [ 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