• kgtp linux内核调试


    作者:朱辉 

    开源网址: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 modules CC /root/kgtp-20140510/gtp.mod.o LD [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 = "/00r", '00' <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,%rsp
    
    24              struct inode *inode = file->f_path.dentry->d_inode;
    0xffffffff810d7536 <vfs_readdir+23>:    mov    0x18(%rdi),%rax
    0xffffffff810d753a <vfs_readdir+27>:    mov    0x10(%rax),%r12
    
    25              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,%ebx
    
    30              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,%ebx
    
    34              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,%ebx
    
    40                      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,%ebx
    
    44              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

  • 相关阅读:
    如何提升程序员的工作效率?
    MacOS 上网络故障诊断
    阅读混淆过的Android代码的确不易
    复旦投毒案落下帷幕
    正确把握深度和广度
    Freemarker的数据模型使用
    xilink se14.7 win10闪退
    浅谈 pid的原理与差异
    win10系统激活
    stm8 同时使用dac和adc 采集异常,电平异常
  • 原文地址:https://www.cnblogs.com/zengkefu/p/4894252.html
Copyright © 2020-2023  润新知