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
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内核调试相关推荐
- 开源项目-基于Intel VT技术的Linux内核调试器
本开源项目将硬件虚拟化技术应用在内核调试器上,使内核调试器成为VMM,将操作系统置于虚拟机中运行,即操作系统成为GuestOS,以这样的一种形式进行调试,最主要的好处就是调试器对操作系统完全透明.如下 ...
- Linux内核调试 - 一般人儿我都不告诉他(一)【转】
转自:http://www.cnblogs.com/armlinux/archive/2011/04/14/2396821.html 悄悄地进入Linux内核调试(一) 本文基址:http://blo ...
- 基于IntelVt技术的Linux内核调试器 - 2
4 基于IntelVt技术的Linux内核调试器- 调试器设计与实现(2):调试核心 4.1反汇编引擎 如果说调试框架是一个调试器的灵魂,那么接口与反汇编引擎就是一个调试器的身体.我们在调试过程中是要 ...
- Linux 内核调试器 调试指南
Linux 内核调试器内幕 KDB 入门指南 Hariprasad Nellitheertha (nharipra@in.ibm.com), 软件工程师, IBM 简介: 调试内核问题时,能够跟踪内核 ...
- Linux内核调试的方式以及工具集锦
Linux内核调试的方式以及工具集锦 CSDN GitHub Linux内核调试的方式以及工具集锦 LDD-LinuxDeviceDrivers/study/debug 本作品采用知识共享署名-非商 ...
- Linux内核调试原理和工具介绍--理解静态插装/动态插装、tracepoint、ftrace、kprobe、SystemTap、Perf、eBPF
可以将linux跟踪系统分成Tracer(跟踪数据来自哪里),数据收集分析(如"ftrace")和跟踪前端(更方便的用户态工具). 1. 数据源(Tracers) printk 是 ...
- linux下jtag命令,[转载]LINUX内核调试过程(使用OpenJtag + OpenOCD)
[转载]LINUX内核调试过程(使用OpenJtag + OpenOCD) (2012-04-12 02:02:27) 标签: 杂谈 [转载]LINUX内核调试过程(使用OpenJtag + Open ...
- Linux内核调试方法总结【转】
转自:http://my.oschina.net/fgq611/blog/113249 内核开发比用户空间开发更难的一个因素就是内核调试艰难.内核错误往往会导致系统宕机,很难保留出错时的现场.调试内核 ...
- Linux内核调试方法总结
[转]Linux内核调试方法总结 目录[-] 一 调试前的准备 二 内核中的bug 三 内核调试配置选项 1 内核配置 2 调试原子操作 四 引发bug并打印信息 1 BUG()和BUG ...
最新文章
- import configparser config.read(config_path) 报错 UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0x
- 鸿蒙和安卓,到底有什么区别?
- 这些故事说的都是你——译者带你读《硅谷革命》
- P1081 开车旅行 倍增 洛谷
- android linux截图库,Android中截图(surfaceView)源码
- 重学java基础第十一课:基本的dos命令
- 纽大博士宿舍内自缢身亡,本月即将毕业
- 谷歌正在为Chromebook自研基于Arm的处理器
- 空间分析方法在计算机上的应用,常见的空间分析方法(很经典的总结)
- mysql数据库三表联查
- Dreamwear如何创建javascript_内存管理+如何处理4种常见的内存泄漏
- 浏览器使用:chrome谷歌浏览器网页截图capture+火狐浏览器的历史在哪?
- 复旦校长官宣:复旦大学即将推出“不升也能留”计划!
- html+css制作三角形
- 朴素贝叶斯、费舍尔分类方法
- Linux-第1节-常见指令以及权限理解
- 断言是什么?(编程里面的东西)
- Dijkstra Floyd RRT A* D* LPA* D*-Lite 算法比较
- 华中与北航计算机,华中科技大和北航哪个好
- 修谱为什么选择数字家谱?80岁老人:这四个优势太给力
热门文章
- Codewars--8kyu解题集
- EnjoyingSoft之Mule ESB开发教程第二篇:Mule ESB基本概念
- bzoj1010[HNOI2008]玩具装箱toy 斜率优化dp
- MySQL 报错 1093
- webpack之react开发前准备
- 【HEVC帧间预测论文】P1.2 An Efficient Inter Mode Decision Approach for H.264 Video Codin
- Educational Codeforces Round 1(D. Igor In the Museum) (BFS+离线访问)
- HTML5-A*寻路算法2
- 教你轻松搞定javascript中的正则
- angularjs控制器controller