~ [ 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 (Architecture i386) and /Documentation/translations/zh_CN/dev-tools/gdb-kernel-debugging.rst (Architecture sparc)


  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版本     37 - 构建gdb脚本(适用于内核v5.1版本及以上)
 38                                                    38 
 39     make scripts_gdb                               39     make scripts_gdb
 40                                                    40 
 41 - 启用QEMU/KVM的gdb stub,可以通过如     41 - 启用QEMU/KVM的gdb stub,可以通过如下方式实现
 42                                                    42 
 43     - 在VM启动时,通过在QEMU命令行     43     - 在VM启动时,通过在QEMU命令行中添加“-s”参数
 44                                                    44 
 45    4546                                                    46 
 47     - 在运行时通过从QEMU监视控制台     47     - 在运行时通过从QEMU监视控制台发送“gdbserver”
 48                                                    48 
 49 - 切换到/path/to/linux-build(内核源码     49 - 切换到/path/to/linux-build(内核源码编译)目录
 50                                                    50 
 51 - 启动gdb:gdb vmlinux                          51 - 启动gdb:gdb vmlinux
 52                                                    52 
 53   注意:某些发行版可能会将gdb脚     53   注意:某些发行版可能会将gdb脚本的自动加载限制在已知的安全目录中。
 54   如果gdb报告拒绝加载vmlinux-gdb.py(     54   如果gdb报告拒绝加载vmlinux-gdb.py(相关命令找不到),请将::
 55                                                    55 
 56     add-auto-load-safe-path /path/to/linux-bui     56     add-auto-load-safe-path /path/to/linux-build
 57                                                    57 
 58   添加到~/.gdbinit。更多详细信息,     58   添加到~/.gdbinit。更多详细信息,请参阅gdb帮助信息。
 59                                                    59 
 60 - 连接到已启动的guest环境::               60 - 连接到已启动的guest环境::
 61                                                    61 
 62     (gdb) target remote :1234                      62     (gdb) target remote :1234
 63                                                    63 
 64                                                    64 
 65 使用Linux提供的gdb脚本的示例             65 使用Linux提供的gdb脚本的示例
 66 ----------------------------                       66 ----------------------------
 67                                                    67 
 68 - 加载模块(以及主内核)符号::        68 - 加载模块(以及主内核)符号::
 69                                                    69 
 70     (gdb) lx-symbols                               70     (gdb) lx-symbols
 71     loading vmlinux                                71     loading vmlinux
 72     scanning for modules in /home/user/linux/b     72     scanning for modules in /home/user/linux/build
 73     loading @0xffffffffa0020000: /home/user/li     73     loading @0xffffffffa0020000: /home/user/linux/build/net/netfilter/xt_tcpudp.ko
 74     loading @0xffffffffa0016000: /home/user/li     74     loading @0xffffffffa0016000: /home/user/linux/build/net/netfilter/xt_pkttype.ko
 75     loading @0xffffffffa0002000: /home/user/li     75     loading @0xffffffffa0002000: /home/user/linux/build/net/netfilter/xt_limit.ko
 76     loading @0xffffffffa00ca000: /home/user/li     76     loading @0xffffffffa00ca000: /home/user/linux/build/net/packet/af_packet.ko
 77     loading @0xffffffffa003c000: /home/user/li     77     loading @0xffffffffa003c000: /home/user/linux/build/fs/fuse/fuse.ko
 78     ...                                            78     ...
 79     loading @0xffffffffa0000000: /home/user/li     79     loading @0xffffffffa0000000: /home/user/linux/build/drivers/ata/ata_generic.ko
 80                                                    80 
 81 - 对一些尚未加载的模块中的函数     81 - 对一些尚未加载的模块中的函数函数设置断点,例如::
 82                                                    82 
 83     (gdb) b btrfs_init_sysfs                       83     (gdb) b btrfs_init_sysfs
 84     Function "btrfs_init_sysfs" not defined.       84     Function "btrfs_init_sysfs" not defined.
 85     Make breakpoint pending on future shared l     85     Make breakpoint pending on future shared library load? (y or [n]) y
 86     Breakpoint 1 (btrfs_init_sysfs) pending.       86     Breakpoint 1 (btrfs_init_sysfs) pending.
 87                                                    87 
 88 - 继续执行::                                   88 - 继续执行::
 89                                                    89 
 90     (gdb) c                                        90     (gdb) c
 91                                                    91 
 92 - 加载模块并且能观察到正在加载     92 - 加载模块并且能观察到正在加载的符号以及断点命中::
 93                                                    93 
 94     loading @0xffffffffa0034000: /home/user/li     94     loading @0xffffffffa0034000: /home/user/linux/build/lib/libcrc32c.ko
 95     loading @0xffffffffa0050000: /home/user/li     95     loading @0xffffffffa0050000: /home/user/linux/build/lib/lzo/lzo_compress.ko
 96     loading @0xffffffffa006e000: /home/user/li     96     loading @0xffffffffa006e000: /home/user/linux/build/lib/zlib_deflate/zlib_deflate.ko
 97     loading @0xffffffffa01b1000: /home/user/li     97     loading @0xffffffffa01b1000: /home/user/linux/build/fs/btrfs/btrfs.ko
 98                                                    98 
 99     Breakpoint 1, btrfs_init_sysfs () at /home     99     Breakpoint 1, btrfs_init_sysfs () at /home/user/linux/fs/btrfs/sysfs.c:36
100     36              btrfs_kset = kset_create_a    100     36              btrfs_kset = kset_create_and_add("btrfs", NULL, fs_kobj);
101                                                   101 
102 - 查看内核的日志缓冲区::                102 - 查看内核的日志缓冲区::
103                                                   103 
104     (gdb) lx-dmesg                                104     (gdb) lx-dmesg
105     [     0.000000] Initializing cgroup subsys    105     [     0.000000] Initializing cgroup subsys cpuset
106     [     0.000000] Initializing cgroup subsys    106     [     0.000000] Initializing cgroup subsys cpu
107     [     0.000000] Linux version 3.8.0-rc4-db    107     [     0.000000] Linux version 3.8.0-rc4-dbg+ (...
108     [     0.000000] Command line: root=/dev/sd    108     [     0.000000] Command line: root=/dev/sda2 resume=/dev/sda1 vga=0x314
109     [     0.000000] e820: BIOS-provided physic    109     [     0.000000] e820: BIOS-provided physical RAM map:
110     [     0.000000] BIOS-e820: [mem 0x00000000    110     [     0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009fbff] usable
111     [     0.000000] BIOS-e820: [mem 0x00000000    111     [     0.000000] BIOS-e820: [mem 0x000000000009fc00-0x000000000009ffff] reserved
112     ....                                          112     ....
113                                                   113 
114 - 查看当前task struct结构体的字段(    114 - 查看当前task struct结构体的字段(仅x86和arm64支持)::
115                                                   115 
116     (gdb) p $lx_current().pid                     116     (gdb) p $lx_current().pid
117     $1 = 4998                                     117     $1 = 4998
118     (gdb) p $lx_current().comm                    118     (gdb) p $lx_current().comm
119     $2 = "modprobe\000\000\000\000\000\000\000    119     $2 = "modprobe\000\000\000\000\000\000\000"
120                                                   120 
121 - 对当前或指定的CPU使用per-cpu函数:    121 - 对当前或指定的CPU使用per-cpu函数::
122                                                   122 
123     (gdb) p $lx_per_cpu("runqueues").nr_runnin    123     (gdb) p $lx_per_cpu("runqueues").nr_running
124     $3 = 1                                        124     $3 = 1
125     (gdb) p $lx_per_cpu("runqueues", 2).nr_run    125     (gdb) p $lx_per_cpu("runqueues", 2).nr_running
126     $4 = 0                                        126     $4 = 0
127                                                   127 
128 - 使用container_of查看更多hrtimers信息    128 - 使用container_of查看更多hrtimers信息::
129                                                   129 
130     (gdb) set $next = $lx_per_cpu("hrtimer_bas    130     (gdb) set $next = $lx_per_cpu("hrtimer_bases").clock_base[0].active.next
131     (gdb) p *$container_of($next, "struct hrti    131     (gdb) p *$container_of($next, "struct hrtimer", "node")
132     $5 = {                                        132     $5 = {
133       node = {                                    133       node = {
134         node = {                                  134         node = {
135           __rb_parent_color = 1844661213335525    135           __rb_parent_color = 18446612133355256072,
136           rb_right = 0x0 <irq_stack_union>,       136           rb_right = 0x0 <irq_stack_union>,
137           rb_left = 0x0 <irq_stack_union>         137           rb_left = 0x0 <irq_stack_union>
138         },                                        138         },
139         expires = {                               139         expires = {
140           tv64 = 1835268000000                    140           tv64 = 1835268000000
141         }                                         141         }
142       },                                          142       },
143       _softexpires = {                            143       _softexpires = {
144         tv64 = 1835268000000                      144         tv64 = 1835268000000
145       },                                          145       },
146       function = 0xffffffff81078232 <tick_sche    146       function = 0xffffffff81078232 <tick_sched_timer>,
147       base = 0xffff88003fd0d6f0,                  147       base = 0xffff88003fd0d6f0,
148       state = 1,                                  148       state = 1,
149       start_pid = 0,                              149       start_pid = 0,
150       start_site = 0xffffffff81055c1f <hrtimer    150       start_site = 0xffffffff81055c1f <hrtimer_start_range_ns+20>,
151       start_comm = "swapper/2\000\000\000\000\    151       start_comm = "swapper/2\000\000\000\000\000\000"
152     }                                             152     }
153                                                   153 
154                                                   154 
155 命令和辅助调试功能列表                 155 命令和辅助调试功能列表
156 ----------------------                            156 ----------------------
157                                                   157 
158 命令和辅助调试功能可能会随着时    158 命令和辅助调试功能可能会随着时间的推移而改进,此文显示的是初始版本的部分示例::
159                                                   159 
160  (gdb) apropos lx                                 160  (gdb) apropos lx
161  function lx_current -- Return current task       161  function lx_current -- Return current task
162  function lx_module -- Find module by name and    162  function lx_module -- Find module by name and return the module variable
163  function lx_per_cpu -- Return per-cpu variabl    163  function lx_per_cpu -- Return per-cpu variable
164  function lx_task_by_pid -- Find Linux task by    164  function lx_task_by_pid -- Find Linux task by PID and return the task_struct variable
165  function lx_thread_info -- Calculate Linux th    165  function lx_thread_info -- Calculate Linux thread_info from task variable
166  lx-dmesg -- Print Linux kernel log buffer        166  lx-dmesg -- Print Linux kernel log buffer
167  lx-lsmod -- List currently loaded modules        167  lx-lsmod -- List currently loaded modules
168  lx-symbols -- (Re-)load symbols of Linux kern    168  lx-symbols -- (Re-)load symbols of Linux kernel and currently loaded modules
169                                                   169 
170 可以通过“help <command-name>”或“hel    170 可以通过“help <command-name>”或“help function <function-name>”命令
171 获取指定命令或指定调试功能的更    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