作者:朱辉

开源网址:https://github.com/teawater

http://teawater.github.io/kgtp/      有中文版说明

内核编绎:

General setup  --->
     [ * ] Prompt for development and/or incomplete code/drivers
     [ * ] Kprobe
Kernel hacking  --->
     [ * ] Compile the kernel with debug info
     [ * ] Compile the kernel with frame pointers
gdb版本:
 
KGTP_NEED_GDB_VERSION = 7.6

KGTP_INSTALL_GDB = "gdb-7.7"

1.编绎

tar -zxvf kgtp-20140510.tar.gz

[root@localhost kgtp-20140510]# ls
add-ons                   gtp_2.6.20_to_2.6.32.patch  gtp_rb.c      plugin_example.c
dkms.conf                 gtp_2.6.33_to_2.6.38.patch  kgtpcn.odt    putgtprsp.c
dkms_others_install.sh    gtp_2.6.39.patch            kgtpcn.pdf    README.md
dkms_others_uninstall.sh  gtp_3.0_to_3.6.patch        kgtp.odt      ring_buffer.c
getframe.c                gtp_3.7_to_upstream.patch   kgtp.pdf      ring_buffer.h
getgtprsp.pl              gtp.c                       kgtp.py       UPDATE
getmod.c                  gtp.h                       Makefile
getmod.py                 gtp_older_to_2.6.19.patch   perf_event.c
[root@localhost kgtp-20140510]# make
make CROSS_COMPILE= -C /lib/modules/2.6.32/build/ M=/root/kgtp-20140510 modules
make[1]: Entering directory `/usr/src/kernels/linux-2.6.32'
  CC [M]  /root/kgtp-20140510/gtp.o
/root/kgtp-20140510/gtp.c:132:2: warning: #warning "Current Kernel is too old.  Function of performance counters is not available."
/root/kgtp-20140510/gtp.c:168:2: warning: #warning "Cannot trace user program because the Linux Kernel that older than 3.9 doesn't support UPROBES."
/root/kgtp-20140510/gtp_rb.c: In function ‘gtp_rb_walk’:
/root/kgtp-20140510/gtp_rb.c:337: warning: ‘step’ may be used uninitialized in this function
/root/kgtp-20140510/gtp.c:132:2: warning: #warning "Current Kernel is too old.  Function of performance counters is not available."
/root/kgtp-20140510/gtp.c:168:2: warning: #warning "Cannot trace user program because the Linux Kernel that older than 3.9 doesn't support UPROBES."Building modules, stage 2.MODPOST 1 modulesCC      /root/kgtp-20140510/gtp.mod.oLD [M]  /root/kgtp-20140510/gtp.ko
make[1]: Leaving directory `/usr/src/kernels/linux-2.6.32'
gcc -O2 -static -o getmod getmod.c
gcc -O2 -static -o getframe getframe.c
gcc -O2 -static -o putgtprsp putgtprsp.c

2.insmod   gtp.ko

3.  mount -t sysfs none /sys/

mount   -t  debugfs none  /sys/kernel/debug/

 

4. cd  /usr/src/kernels/linux-2.6.32    进入源代码目录

5.gdb vmlinux

6.(gdb) target remote /sys/kernel/debug/gtp

7. 调试内核

(gdb) trace vfs_readdir     跟踪涵数名
Tracepoint 1 at 0xffffffff810d751f: file fs/readdir.c, line 23.--------------------------------------------------------------------
(gdb) actions   设轩预到跟踪点进行收集信息
Enter actions for tracepoint 1, one per line.
End with a line saying just "end".> collect jiffies_64
> collect file->f_path.dentry->d_iname
> end-------------------------------------------------------------------------------------------
(gdb) tstart        开始跟踪--------------------------------------------------------------------------------------------
(gdb) shell ls   :跟踪ls
arch     Documentation  init    MAINTAINERS     net             security    virt
block    drivers        ipc     Makefile        README          sound       vmlinux
COPYING  firmware       Kbuild  mm              REPORTING-BUGS  System.map  vmlinux.o
CREDITS  fs             kernel  modules.order   samples         tools
crypto   include        lib     Module.symvers  scripts         usr----------------------------------------------------------------------------------------------
(gdb) tstop       停止跟踪-------------------------------------------------------------------------------------------------
(gdb) tfind
#0  vfs_readdir (file=0xffff88003c087480, filler=0xffffffff810d7468 <filldir>, buf=0xffff88004884df38) at fs/readdir.c:23
23      {
(gdb) p jiffies_64
$1 = 4297940608
(gdb) p file->f_path.dentry->d_iname
$2 = "/\000r", '\000' <repeats 28 times>

(gdb) list vfs_readdir
18      #include <linux/unistd.h>
19
20      #include <asm/uaccess.h>
21
22      int vfs_readdir(struct file *file, filldir_t filler, void *buf)
23      {
24              struct inode *inode = file->f_path.dentry->d_inode;
25              int res = -ENOTDIR;
26              if (!file->f_op || !file->f_op->readdir)
27                      goto out;

(gdb) disassemble /m vfs_readdir
Dump of assembler code for function vfs_readdir:
23      {
0xffffffff810d751f <vfs_readdir+0>:     push   %r15
0xffffffff810d7521 <vfs_readdir+2>:     mov    %rdx,%r15
0xffffffff810d7524 <vfs_readdir+5>:     push   %r14
0xffffffff810d7526 <vfs_readdir+7>:     mov    %rsi,%r14
0xffffffff810d7529 <vfs_readdir+10>:    push   %r13
0xffffffff810d752b <vfs_readdir+12>:    push   %r12
0xffffffff810d752d <vfs_readdir+14>:    push   %rbp
0xffffffff810d752e <vfs_readdir+15>:    mov    %rdi,%rbp
0xffffffff810d7531 <vfs_readdir+18>:    push   %rbx
0xffffffff810d7532 <vfs_readdir+19>:    sub    $0x8,%rsp24              struct inode *inode = file->f_path.dentry->d_inode;
0xffffffff810d7536 <vfs_readdir+23>:    mov    0x18(%rdi),%rax
0xffffffff810d753a <vfs_readdir+27>:    mov    0x10(%rax),%r1225              int res = -ENOTDIR;
26              if (!file->f_op || !file->f_op->readdir)
0xffffffff810d753e <vfs_readdir+31>:    mov    0x20(%rdi),%rax
---Type <return> to continue, or q <return> to quit---
0xffffffff810d7542 <vfs_readdir+35>:    test   %rax,%rax
0xffffffff810d7545 <vfs_readdir+38>:    je     0xffffffff810d75b3 <vfs_readdir+148>
0xffffffff810d7547 <vfs_readdir+40>:    cmpq   $0x0,0x30(%rax)
0xffffffff810d754c <vfs_readdir+45>:    je     0xffffffff810d75b3 <vfs_readdir+148>27                      goto out;
28
29              res = security_file_permission(file, MAY_READ);
0xffffffff810d754e <vfs_readdir+47>:    mov    $0x4,%esi
0xffffffff810d7553 <vfs_readdir+52>:    callq  0xffffffff8113848d <security_file_permission>
0xffffffff810d755a <vfs_readdir+59>:    mov    %eax,%ebx30              if (res)
0xffffffff810d7558 <vfs_readdir+57>:    test   %eax,%eax
0xffffffff810d755c <vfs_readdir+61>:    jne    0xffffffff810d75b8 <vfs_readdir+153>31                      goto out;
32
33              res = mutex_lock_killable(&inode->i_mutex);
0xffffffff810d755e <vfs_readdir+63>:    lea    0xb8(%r12),%r13
---Type <return> to continue, or q <return> to quit---
0xffffffff810d7566 <vfs_readdir+71>:    mov    %r13,%rdi
0xffffffff810d7569 <vfs_readdir+74>:    callq  0xffffffff812f4bff <mutex_lock_killable>
0xffffffff810d7570 <vfs_readdir+81>:    mov    %eax,%ebx34              if (res)
0xffffffff810d756e <vfs_readdir+79>:    test   %eax,%eax
0xffffffff810d7572 <vfs_readdir+83>:    jne    0xffffffff810d75b8 <vfs_readdir+153>35                      goto out;
36
37              res = -ENOENT;
38              if (!IS_DEADDIR(inode)) {
0xffffffff810d7574 <vfs_readdir+85>:    testb  $0x10,0x220(%r12)
0xffffffff810d757d <vfs_readdir+94>:    mov    $0xfffffffe,%ebx
0xffffffff810d7582 <vfs_readdir+99>:    jne    0xffffffff810d75a9 <vfs_readdir+138>39                      res = file->f_op->readdir(file, buf, filler);
0xffffffff810d7584 <vfs_readdir+101>:   mov    0x20(%rbp),%rax
0xffffffff810d7588 <vfs_readdir+105>:   mov    %r14,%rdx
0xffffffff810d758b <vfs_readdir+108>:   mov    %r15,%rsi
---Type <return> to continue, or q <return> to quit---
0xffffffff810d758e <vfs_readdir+111>:   mov    %rbp,%rdi
0xffffffff810d7591 <vfs_readdir+114>:   callq  *0x30(%rax)
0xffffffff810d7598 <vfs_readdir+121>:   mov    %eax,%ebx40                      file_accessed(file);
41              }
42              mutex_unlock(&inode->i_mutex);
0xffffffff810d75a9 <vfs_readdir+138>:   mov    %r13,%rdi
0xffffffff810d75ac <vfs_readdir+141>:   callq  0xffffffff812f4a35 <mutex_unlock>
0xffffffff810d75b1 <vfs_readdir+146>:   jmp    0xffffffff810d75b8 <vfs_readdir+153>43      out:
0xffffffff810d75b3 <vfs_readdir+148>:   mov    $0xffffffec,%ebx44              return res;
45      }
0xffffffff810d75b8 <vfs_readdir+153>:   pop    %rcx
0xffffffff810d75b9 <vfs_readdir+154>:   mov    %ebx,%eax
0xffffffff810d75bb <vfs_readdir+156>:   pop    %rbx
0xffffffff810d75bc <vfs_readdir+157>:   pop    %rbp
---Type <return> to continue, or q <return> to quit---
0xffffffff810d75bd <vfs_readdir+158>:   pop    %r12
0xffffffff810d75bf <vfs_readdir+160>:   pop    %r13
0xffffffff810d75c1 <vfs_readdir+162>:   pop    %r14
0xffffffff810d75c3 <vfs_readdir+164>:   pop    %r15
0xffffffff810d75c5 <vfs_readdir+166>:   retq 

http://www.cnblogs.com/ahuo/archive/2012/08/10/2632227.html

转载于:https://www.cnblogs.com/zengkefu/p/4894252.html

kgtp linux内核调试相关推荐

  1. 开源项目-基于Intel VT技术的Linux内核调试器

    本开源项目将硬件虚拟化技术应用在内核调试器上,使内核调试器成为VMM,将操作系统置于虚拟机中运行,即操作系统成为GuestOS,以这样的一种形式进行调试,最主要的好处就是调试器对操作系统完全透明.如下 ...

  2. Linux内核调试 - 一般人儿我都不告诉他(一)【转】

    转自:http://www.cnblogs.com/armlinux/archive/2011/04/14/2396821.html 悄悄地进入Linux内核调试(一) 本文基址:http://blo ...

  3. 基于IntelVt技术的Linux内核调试器 - 2

    4 基于IntelVt技术的Linux内核调试器- 调试器设计与实现(2):调试核心 4.1反汇编引擎 如果说调试框架是一个调试器的灵魂,那么接口与反汇编引擎就是一个调试器的身体.我们在调试过程中是要 ...

  4. Linux 内核调试器 调试指南

    Linux 内核调试器内幕 KDB 入门指南 Hariprasad Nellitheertha (nharipra@in.ibm.com), 软件工程师, IBM 简介: 调试内核问题时,能够跟踪内核 ...

  5. Linux内核调试的方式以及工具集锦

    Linux内核调试的方式以及工具集锦 CSDN GitHub Linux内核调试的方式以及工具集锦 LDD-LinuxDeviceDrivers/study/debug  本作品采用知识共享署名-非商 ...

  6. Linux内核调试原理和工具介绍--理解静态插装/动态插装、tracepoint、ftrace、kprobe、SystemTap、Perf、eBPF

    可以将linux跟踪系统分成Tracer(跟踪数据来自哪里),数据收集分析(如"ftrace")和跟踪前端(更方便的用户态工具). 1. 数据源(Tracers) printk 是 ...

  7. linux下jtag命令,[转载]LINUX内核调试过程(使用OpenJtag + OpenOCD)

    [转载]LINUX内核调试过程(使用OpenJtag + OpenOCD) (2012-04-12 02:02:27) 标签: 杂谈 [转载]LINUX内核调试过程(使用OpenJtag + Open ...

  8. Linux内核调试方法总结【转】

    转自:http://my.oschina.net/fgq611/blog/113249 内核开发比用户空间开发更难的一个因素就是内核调试艰难.内核错误往往会导致系统宕机,很难保留出错时的现场.调试内核 ...

  9. Linux内核调试方法总结

    [转]Linux内核调试方法总结 目录[-] 一  调试前的准备 二  内核中的bug 三  内核调试配置选项 1  内核配置 2  调试原子操作 四  引发bug并打印信息 1  BUG()和BUG ...

最新文章

  1. import configparser config.read(config_path) 报错 UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0x
  2. 鸿蒙和安卓,到底有什么区别?
  3. 这些故事说的都是你——译者带你读《硅谷革命》
  4. P1081 开车旅行 倍增 洛谷
  5. android linux截图库,Android中截图(surfaceView)源码
  6. 重学java基础第十一课:基本的dos命令
  7. 纽大博士宿舍内自缢身亡,本月即将毕业
  8. 谷歌正在为Chromebook自研基于Arm的处理器
  9. 空间分析方法在计算机上的应用,常见的空间分析方法(很经典的总结)
  10. mysql数据库三表联查
  11. Dreamwear如何创建javascript_内存管理+如何处理4种常见的内存泄漏
  12. 浏览器使用:chrome谷歌浏览器网页截图capture+火狐浏览器的历史在哪?
  13. 复旦校长官宣:复旦大学即将推出“不升也能留”计划!
  14. html+css制作三角形
  15. 朴素贝叶斯、费舍尔分类方法
  16. Linux-第1节-常见指令以及权限理解
  17. 断言是什么?(编程里面的东西)
  18. Dijkstra Floyd RRT A* D* LPA* D*-Lite 算法比较
  19. 华中与北航计算机,华中科技大和北航哪个好
  20. 修谱为什么选择数字家谱?80岁老人:这四个优势太给力

热门文章

  1. Codewars--8kyu解题集
  2. EnjoyingSoft之Mule ESB开发教程第二篇:Mule ESB基本概念
  3. bzoj1010[HNOI2008]玩具装箱toy 斜率优化dp
  4. MySQL 报错 1093
  5. webpack之react开发前准备
  6. 【HEVC帧间预测论文】P1.2 An Efficient Inter Mode Decision Approach for H.264 Video Codin
  7. Educational Codeforces Round 1(D. Igor In the Museum) (BFS+离线访问)
  8. HTML5-A*寻路算法2
  9. 教你轻松搞定javascript中的正则
  10. angularjs控制器controller