KGTP 介绍
KGTP 是一个能在产品系统上实时分析 Linux 内核和应用程序(包括 Android)问题的全面动态跟踪器。 使用 KGTP 不需要 在 Linux 内核上打 PATCH 或者重新编译,只要编译 KGTP 模块并insmod 就可以。 其让 Linux 内核提供一个远程 GDB 调试接口,于是在本地或者远程的主机上的 GDB 可以在不需要停止内核的情况下用 GDB tracepoint 和其他一些功能调试和跟踪Linux内核和应用程序。
Github
https://github.com/teawater/kgtp
在上面有帮助手册,也可以点击这里查看帮助手册。
本文目的
在Qemu模拟的vexpress板子上面体验KGTP
软件版本
Linux 4.10
Qemu-2.8
ARM-Versatile Express
arm-none-linux-gnueabi 4.8.3
正文
一、交叉编译gdb
请参考博客 http://www.cnblogs.com/pengdonglin137/p/7093417.html
编译完成后,将生成的gdb可执行程序拷贝到板子上
二、重新编译kernel,打开相关的配置
要编译kgtp的话,需要打开下面的几个配置:
General setup ---> [*] Kprobes [*] Enable loadable module support ---> Kernel hacking ---> Compile-time checks and compiler options ---> [*] Compile the kernel with debug info [*] Tracers ---> [*] Enable uprobes-based dynamic events
使能上面的配置后,重新编译kernel。
三、交叉编译KGTP
目前KGTP在Linux-4.10上还无法直接编译通过,需要稍作修改,修改后的kgtp我上传到了github,可以使用下面的命令下载:
git clone git@github.com:pengdonglin137/kgtp.git -b aarch32_version
下载完成后,需要对Makefile稍作修改,将其中的INSTALL、KERNELDIR以及OUT
使用下面的命令编译
make make install
然后将生成的可执行程序以及ko文件拷贝到板子上
四、测试
1、本地测试
我们将编译出的vmlinux拷贝到板子上,加载gtp.ko,直接在板子上运行GDB,然后连接GTP,开始测试:
# 在PC机上将vmlinux拷贝到NFS共享目录下 cp /home/pengdonglin/src/qemu/aarch32/linux-4.10/out_aarch32/vmlinux /nfsroot/ # 进入板子,挂载共享目录 [root@vexpress ]# mount -t nfs -o nolock 192.168.1.100:/nfsroot /mnt # 加载驱动 [root@vexpress ]# insmod /mnt/install/modules/gtp.ko # 运行gdb [root@vexpress ]# gdb GNU gdb (GDB) 8.0 Copyright (C) 2017 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "arm-none-linux-gnueabi". Type "show configuration" for configuration details. For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>. Find the GDB manual and other documentation resources online at: <http://www.gnu.org/software/gdb/documentation/>. For help, type "help". Type "apropos word" to search for commands related to "word". # 加在vmlinux (gdb) file /mnt/vmlinux Reading symbols from /mnt/vmlinux...done. # 将gdb连接到gtp上 (gdb) target remote /sys/kernel/debug/gtp Remote debugging using /sys/kernel/debug/gtp #打印jiffies_64变量 (gdb) p jiffies_64 $1 = 4294969128 (gdb) p jiffies_64 $2 = 4294969245 (gdb) p jiffies_64 $3 = 4294969332 (gdb) p jiffies_64 $4 = 4294969419 (gdb)
可以看到,jiffies_64的值一直在递增。
2、远程测试
在PC上运行GDB,连接板子上的GTP,开始调试:
在板子上运行nc命令: nc -l -p 2345 < /sys/kernel/debug/gtp > /sys/kernel/debug/gtp 之后,nc会在那里等待连接。 在PC上运行GDB: $arm-none-linux-gnueabi-gdb ./vmlinux GNU gdb (Sourcery CodeBench Lite 2014.05-29) 7.7.50.20140217-cvs Copyright (C) 2014 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "--host=i686-pc-linux-gnu --target=arm-none-linux-gnueabi". Type "show configuration" for configuration details. For bug reporting instructions, please see: <https://sourcery.mentor.com/GNUToolchain/>. Find the GDB manual and other documentation resources online at: <http://www.gnu.org/software/gdb/documentation/>. For help, type "help". Type "apropos word" to search for commands related to "word"... Reading symbols from ./vmlinux...done. # 连接板子上的GTP (gdb) target remote 192.168.1.2:2345 Remote debugging using 192.168.1.2:2345 0x00000000 in ?? () # 查看jiffies_64的值 (gdb) p jiffies_64 $1 = 4295030342 (gdb) p jiffies_64 $2 = 4295030453 (gdb) p jiffies_64 $3 = 4295030536 (gdb) p jiffies_64 $4 = 4295030622 (gdb)
完。