kgtp linux内核调试
作者:朱辉
开源网址:https://github.com/teawater
http://teawater.github.io/kgtp/ 有中文版说明
内核编绎:
General setup ---> [ * ] Prompt for development and/or incomplete code/drivers [ * ] KprobeKernel hacking ---> [ * ] Compile the kernel with debug info [ * ] Compile the kernel with frame pointers1.编绎
tar -zxvf kgtp-20140510.tar.gz [root@localhost kgtp-]# ls
add-ons gtp_2..20_to_2.6.32.patch gtp_rb.c plugin_example.c
dkms.conf gtp_2..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..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-]# make
make CROSS_COMPILE= -C /lib/modules/2.6./build/ M=/root/kgtp- modules
make[]: Entering directory `/usr/src/kernels/linux-2.6.'
CC [M] /root/kgtp-/gtp.o
/root/kgtp-/gtp.c::: warning: #warning "Current Kernel is too old. Function of performance counters is not available."
/root/kgtp-/gtp.c::: warning: #warning "Cannot trace user program because the Linux Kernel that older than 3.9 doesn't support UPROBES."
/root/kgtp-/gtp_rb.c: In function ‘gtp_rb_walk’:
/root/kgtp-/gtp_rb.c:: warning: ‘step’ may be used uninitialized in this function
/root/kgtp-/gtp.c::: warning: #warning "Current Kernel is too old. Function of performance counters is not available."
/root/kgtp-/gtp.c::: warning: #warning "Cannot trace user program because the Linux Kernel that older than 3.9 doesn't support UPROBES."
Building modules, stage .
MODPOST modules
CC /root/kgtp-/gtp.mod.o
LD [M] /root/kgtp-/gtp.ko
make[]: Leaving directory `/usr/src/kernels/linux-2.6.'
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 at 0xffffffff810d751f: file fs/readdir.c, line .
--------------------------------------------------------------------
(gdb) actions 设轩预到跟踪点进行收集信息
Enter actions for tracepoint , 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
# vfs_readdir (file=0xffff88003c087480, filler=0xffffffff810d7468 <filldir>,
buf=0xffff88004884df38) at fs/readdir.c:
{
(gdb) p jiffies_64
$ =
(gdb) p file->f_path.dentry->d_iname
$ = "/\000r", '\000' <repeats times>
(gdb) list vfs_readdir
#include <linux/unistd.h> #include <asm/uaccess.h> int vfs_readdir(struct file *file, filldir_t filler, void *buf)
{
struct inode *inode = file->f_path.dentry->d_inode;
int res = -ENOTDIR;
if (!file->f_op || !file->f_op->readdir)
goto out;
(gdb) disassemble /m vfs_readdir
Dump of assembler code for function vfs_readdir:
{
0xffffffff810d751f <vfs_readdir+>: push %r15
0xffffffff810d7521 <vfs_readdir+>: mov %rdx,%r15
0xffffffff810d7524 <vfs_readdir+>: push %r14
0xffffffff810d7526 <vfs_readdir+>: mov %rsi,%r14
0xffffffff810d7529 <vfs_readdir+>: push %r13
0xffffffff810d752b <vfs_readdir+>: push %r12
0xffffffff810d752d <vfs_readdir+>: push %rbp
0xffffffff810d752e <vfs_readdir+>: mov %rdi,%rbp
0xffffffff810d7531 <vfs_readdir+>: push %rbx
0xffffffff810d7532 <vfs_readdir+>: sub $0x8,%rsp struct inode *inode = file->f_path.dentry->d_inode;
0xffffffff810d7536 <vfs_readdir+>: mov 0x18(%rdi),%rax
0xffffffff810d753a <vfs_readdir+>: mov 0x10(%rax),%r12 int res = -ENOTDIR;
if (!file->f_op || !file->f_op->readdir)
0xffffffff810d753e <vfs_readdir+>: mov 0x20(%rdi),%rax
---Type <return> to continue, or q <return> to quit---
0xffffffff810d7542 <vfs_readdir+>: test %rax,%rax
0xffffffff810d7545 <vfs_readdir+>: je 0xffffffff810d75b3 <vfs_readdir+>
0xffffffff810d7547 <vfs_readdir+>: cmpq $0x0,0x30(%rax)
0xffffffff810d754c <vfs_readdir+>: je 0xffffffff810d75b3 <vfs_readdir+> goto out; res = security_file_permission(file, MAY_READ);
0xffffffff810d754e <vfs_readdir+>: mov $0x4,%esi
0xffffffff810d7553 <vfs_readdir+>: callq 0xffffffff8113848d <security_file_permission>
0xffffffff810d755a <vfs_readdir+>: mov %eax,%ebx if (res)
0xffffffff810d7558 <vfs_readdir+>: test %eax,%eax
0xffffffff810d755c <vfs_readdir+>: jne 0xffffffff810d75b8 <vfs_readdir+> goto out; res = mutex_lock_killable(&inode->i_mutex);
0xffffffff810d755e <vfs_readdir+>: lea 0xb8(%r12),%r13
---Type <return> to continue, or q <return> to quit---
0xffffffff810d7566 <vfs_readdir+>: mov %r13,%rdi
0xffffffff810d7569 <vfs_readdir+>: callq 0xffffffff812f4bff <mutex_lock_killable>
0xffffffff810d7570 <vfs_readdir+>: mov %eax,%ebx if (res)
0xffffffff810d756e <vfs_readdir+>: test %eax,%eax
0xffffffff810d7572 <vfs_readdir+>: jne 0xffffffff810d75b8 <vfs_readdir+> goto out; res = -ENOENT;
if (!IS_DEADDIR(inode)) {
0xffffffff810d7574 <vfs_readdir+>: testb $0x10,0x220(%r12)
0xffffffff810d757d <vfs_readdir+>: mov $0xfffffffe,%ebx
0xffffffff810d7582 <vfs_readdir+>: jne 0xffffffff810d75a9 <vfs_readdir+> res = file->f_op->readdir(file, buf, filler);
0xffffffff810d7584 <vfs_readdir+>: mov 0x20(%rbp),%rax
0xffffffff810d7588 <vfs_readdir+>: mov %r14,%rdx
0xffffffff810d758b <vfs_readdir+>: mov %r15,%rsi
---Type <return> to continue, or q <return> to quit---
0xffffffff810d758e <vfs_readdir+>: mov %rbp,%rdi
0xffffffff810d7591 <vfs_readdir+>: callq *0x30(%rax)
0xffffffff810d7598 <vfs_readdir+>: mov %eax,%ebx file_accessed(file);
}
mutex_unlock(&inode->i_mutex);
0xffffffff810d75a9 <vfs_readdir+>: mov %r13,%rdi
0xffffffff810d75ac <vfs_readdir+>: callq 0xffffffff812f4a35 <mutex_unlock>
0xffffffff810d75b1 <vfs_readdir+>: jmp 0xffffffff810d75b8 <vfs_readdir+> out:
0xffffffff810d75b3 <vfs_readdir+>: mov $0xffffffec,%ebx return res;
}
0xffffffff810d75b8 <vfs_readdir+>: pop %rcx
0xffffffff810d75b9 <vfs_readdir+>: mov %ebx,%eax
0xffffffff810d75bb <vfs_readdir+>: pop %rbx
0xffffffff810d75bc <vfs_readdir+>: pop %rbp
---Type <return> to continue, or q <return> to quit---
0xffffffff810d75bd <vfs_readdir+>: pop %r12
0xffffffff810d75bf <vfs_readdir+>: pop %r13
0xffffffff810d75c1 <vfs_readdir+>: pop %r14
0xffffffff810d75c3 <vfs_readdir+>: pop %r15
0xffffffff810d75c5 <vfs_readdir+>: retq
http://www.cnblogs.com/ahuo/archive/2012/08/10/2632227.html
kgtp linux内核调试的更多相关文章
- Linux内核调试的方式以及工具集锦【转】
转自:https://blog.csdn.net/gatieme/article/details/68948080 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原 ...
- Linux内核调试的方式以及工具集锦
原文:https://blog.csdn.net/gatieme/article/details/68948080 CSDN GitHubLinux内核调试的方式以及工具集锦 LDD-LinuxDev ...
- Linux内核调试方法总结【转】
转自:http://my.oschina.net/fgq611/blog/113249 内核开发比用户空间开发更难的一个因素就是内核调试艰难.内核错误往往会导致系统宕机,很难保留出错时的现场.调试内核 ...
- linux内核调试指南
linux内核调试指南 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级调试 ***第一部分:基础知识*** 总纲:内核世界的陷阱 源码阅读的陷阱 代码调试的陷阱 原理理解的陷阱 ...
- 【转】Linux内核调试方法总结
目录[-] 一 调试前的准备 二 内核中的bug 三 内核调试配置选项 1 内核配置 2 调试原子操作 四 引发bug并打印信息 1 BUG()和BUG_ON() 2 dump_sta ...
- Linux内核调试方法总结
Linux内核调试方法总结 一 调试前的准备 二 内核中的bug 三 内核调试配置选项 1 内核配置 2 调试原子操作 四 引发bug并打印信息 1 BUG()和BUG_ON() 2 ...
- Linux内核调试方法【转】
转自:http://www.cnblogs.com/shineshqw/articles/2359114.html kdb:只能在汇编代码级进行调试: 优点是不需要两台机器进行调试. gdb:在调试模 ...
- Linux内核调试 - 一般人儿我都不告诉他(一)【转】
转自:http://www.cnblogs.com/armlinux/archive/2011/04/14/2396821.html 悄悄地进入Linux内核调试(一) 本文基址:http://blo ...
- Linux内核调试技术——jprobe使用与实现
前一篇博文介绍了kprobes的原理与kprobe的使用与实现方式,本文介绍kprobes中的另外一种探測技术jprobe.它基于kprobe实现,不能在函数的任何位置插入探測点,仅仅能在函数的入口处 ...
随机推荐
- 关于SizeOf、Length
结论: 到底什么时候用Length,SizeOf呢,我总结下使用Length,Sizeof的场景 1.Length(静态数组或动态数组)----没有问题 2.Length(string/shortst ...
- yum安装Mysql-5.6
MySQL yum库提供了一个简单的和方便的方法来安装和更新MySQL相关的软件包到最新版本. MySQL yum库文档说明:http://dev.mysql.com/doc/mysql-yum-re ...
- 10月15日 | 云栖大会“淘宝移动技术实践&开放论坛”来了!
参会报名链接:http://baichuan.taobao.com/marketing/yunqi#?baichuan_channel=cnblogs 顺应移动互联网消费升级趋势, 淘宝作为移动领域的 ...
- 20165203迭代和JDB测试
1.使用C(n,m)=C(n-1,m-1)+C(n-1,m)公式进行递归编程实现求组合数C(m,n)的功能 public class C { public static void main(Strin ...
- 有关c语言编程
有关C语言编程 统计代码"行数" 对于统计代码"行数",行数不包括空白行和注释行.程序改进如下: while(fgets (mystring , 100 , f ...
- 使用EasyWechat快速开发微信公众号支付
前期准备: 申请微信支付后, 会收到2个参数, 商户id,和商户key.注意,这2个参数,不要和微信的参数混淆.微信参数: appid, appkey, token支付参数: merchant_id( ...
- hdu 3951 硬币围成一圈(博弈)
n个硬币围成一个环 每次只能取1-K个硬币 最后取完者胜 假如5个硬币 每次取1-2个情况1 先手取1个 后手取剩下4个中间2个 破坏了连续 虽然最后剩2个,但先手只能取一个 然后后再取一个 后手胜 ...
- mysql 通过sqoop导入hive
sudo -u hdfs sqoop import --connect jdbc:mysql://192.168.33.93:3306/leochentest --username root --pa ...
- Redis(一)Redis简述
一 Redis 概念 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,和Memcached类似,它支持存储的value类型相对更多,包 ...
- 【51nod】1822 序列求和 V5
题解 我是zz吧 nonprime[i * prime[j]] = 0 = = 还以为是要卡常,卡了半天就是过不掉 我们来说这道题-- 首先,我们考虑一个\(K^2\)做法 \(f_{k}(N) = ...