1、jprobe使用实例 使用jprobe探测函数的入参值,需要编写内核模块。 在分析jprobe_example.c之前先熟悉一下jprobe的基本结构与API接口。 1.1、jprobe结构体与API介绍 struct jprobe结构体定义如下: ? 相关的API如下: int register_jprobe(struct jprobe *jp) //向内核注册jprobe探测点 void unregister_jprobe(struct 在模块的初始化函数中,调用register_jprobe函数向kprobe子系统注册my_jprobe,这样jprobe探测默认就启用了,最后在exit函数中调用unregister_jprobe函数卸载 2.2、注册一个jprobe实例 jprobe探测模块调用register_jprobe函数向内核注册一个jprobe实例,代码路径kernel/kprobes.c,其主要流程如下图: ? ?
关于JProbe JProbe是一个企业级的Java剖析器,提供对内存使用,性能和测试覆盖率的智能诊断。 通过一个统一,直观的控制台,JProbe提供了三种强大的分析工具: JProbe Memory - 内存分析工具可以帮助您快速找出和诊断内存泄漏和过剩垃圾收集的根本原因。 自动化 JProbe允许在夜间构建过程分析内存,性能和覆盖。 JProbe利用ANT(或Maven)构建任务,JUnit测试脚本和一个称为触发器的独特功能来实现自动化分析。 Eclipse插件 JProbe直接使用Eclipse Java IDE进行智能代码性能分析和解决问题。 通过Eclipse插件,JProbe提高代码测试的效率,并促进了自动化内存测试和代码优化最佳实践。
帮你实现了上面说的那些本应该由你自己完毕的工作,这就是jprobe。总的来讲。jprobe的要点在于它实际上就是一个kprobe的prefunc。 ,改成了jprobe的entry函数,而栈信息一点都没有变。 那么我想说的或许正是你所想的,那就是使用jprobe能够实现一个镜像协议栈,我先将代码片断贴上: static struct jprobe steal_jprobe = { .entry = } jprobe_return(); return 0; } static struct jprobe steal_jprobe = { .entry = steal_ip_local_deliver (void) { unregister_jprobe(&steal_jprobe); } module_init(jprobe_init) module_exit(jprobe_exit) MODULE_LICENSE
(). */ jprobe_return(); return 0; } static struct jprobe my_jprobe = { .entry ("Planted jprobe at %p, handler addr %p\n", my_jprobe.kp.addr, my_jprobe.entry); return 0; } static void __exit jprobe_exit(void) { unregister_jprobe(&my_jprobe); pr_info ("jprobe at %p unregistered\n", my_jprobe.kp.addr); } module_init(jprobe_init) module_exit(jprobe_exit /samples/kprobes/jprobe_example.c .
jprobe工作原理 jprobe是基于kprobe实现的,探测的位置在函数的入口点。它采用了一个简单的镜像原则来允许无缝访问被探测函数的参数。 jprobe程序的参数和返回值必须和被探测函数完全相同,并且必须始终以调用函数jprobe_return()作为返回值。 register_jprobe #include <linux/kprobes.h> int register_jprobe(struct jprobe *jp) 在地址jp->kp.addr处设置一个断点 处理程序应该有与被探测函数相同的参数列表和返回类型;在它返回之前,必须调用jprobe_return()。(处理程序实际上从未返回,因为jprobe_return()将控制权返回给Kprobes。) 另外,一个有jprobe或post_handler的探测点不能被优化。
kprobes技术目前提供了3种探测手段:kprobe、jprobe和kretprobe,其中jprobe和kretprobe是基于kprobe实现的,他们分别应用于不同的探测场景中。 kprobes技术包括的3种探测手段分别时kprobe、jprobe和kretprobe。 fault_handler,其中pre_handler函数将在被探测指令被执行前回调,post_handler会在被探测指令执行完毕后回调(注意不是被探测函数),fault_handler会在内存访问出错时被调用;jprobe kprobes的特点与使用限制: 1、kprobes允许在同一个被被探测位置注册多个kprobe,但是目前jprobe却不可以;同时也不允许以其他的jprobe回掉函数和kprobe的post_handler post_handler或单步执行被探测指令时出现内存异常则会调用该回调函数; kprobe_break_handler_t break_handler:在执行某一kprobe过程中触发了断点指令后会调用该函数,用于实现jprobe
kprobes 技术包括的3种探测手段分别时 kprobe、jprobe 和 kretprobe。 fault_handler,其中 pre_handler 函数将在被探测指令被执行前回调,post_handler 会在被探测指令执行完毕后回调(注意不是被探测函数),fault_handler 会在内存访问出错时被调用;jprobe kprobes 的特点与使用限制:kprobes 允许在同一个被探测位置注册多个 kprobe,但是目前 jprobe 却不可以;同时也不允许以其他的 jprobe 回调函数和 kprobe 的 post_handler
kprobes技术包括的3种探测手段分别时kprobe、jprobe和kretprobe。 fault_handler,其中pre_handler函数将在被探测指令被执行前回调,post_handler会在被探测指令执行完毕后回调(注意不是被探测函数),fault_handler会在内存访问出错时被调用;jprobe kprobes的特点与使用限制: kprobes允许在同一个被被探测位置注册多个kprobe,但是目前jprobe却不可以;同时也不允许以其他的jprobe回调函数和kprobe的post_handler
kprobes技术目前提供了3种探测手段:kprobe、jprobe和kretprobe,其中jprobe和kretprobe是基于kprobe实现的,他们分别应用于不同的探测场景中。 本文首先简单描述这3种探测技术的原理与区别,然后主要围绕其中的kprobe技术进行分析并给出一个简单的实例介绍如何利用kprobe进行内核函数探测,最后分析kprobe的实现过程(jprobe和kretprobe kprobes技术包括的3种探测手段分别时kprobe、jprobe和kretprobe。 fault_handler,其中pre_handler函数将在被探测指令被执行前回调,post_handler会在被探测指令执行完毕后回调(注意不是被探测函数),fault_handler会在内存访问出错时被调用;jprobe kprobes的特点与使用限制: 1、kprobes允许在同一个被被探测位置注册多个kprobe,但是目前jprobe却不可以;同时也不允许以其他的jprobe回调函数和kprobe的post_handler
kprobes技术目前提供了3种探测手段:kprobe、jprobe和kretprobe,其中jprobe和kretprobe是基于kprobe实现的,他们分别应用于不同的探测场景中。 kprobes技术包括的3种探测手段分别时kprobe、jprobe和kretprobe。 kprobes的特点与使用限制: 1、kprobes允许在同一个被被探测位置注册多个kprobe,但是目前jprobe却不可以;同时也不允许以其他的jprobe回掉函数和kprobe的post_handler 该流程先不做详细推演分析,后面分析jprobe实现时再细细分析。 下一篇博文将介绍基于kprobe实现的jprobe内核跟踪技术。
这种情况一般用于实现jprobe,因此会调用curent_kprobe的break_handler回调函数,然后在break_handler返回非0的情况下执行单步执行,最后返回1。 具体在jprobe实现中再详细分析。
在这些情况下,最好使用Borland OptimizeIt或JProbe来分析应用程序。 您想要看到的是加载,内存和线程的常规模式。 任何不稳定的行为通常表示性能不佳或某种错误。
基本可以确定内存泄漏 内存使用量增长后又回落,出于一个动态平衡区间,基本排除内存泄漏 GC 日志只能帮忙找到是否有泄漏,找出内存泄漏的地方,需要依赖一些其他的工具 JProfile OptimizedIt JProbe
两种异常指令来对任意地址进行插桩,在此基础之上实现了三种机制: kprobe: 可以被插入到内核的任何指令位置,在被插入指令之前调用kp.pre_handler(),在被插入指令之后调用kp.post_handler() jprobe : 只支持对函数进行插入 kretprobe: 和jprobe类似,机制略有不同,会替换被探测函数的返回地址,让函数先执行插入的钩子函数,再恢复。
或堆转储快照:hprof ) 3、分析快照(或堆转储快照),定位问题 内存泄露、内存溢出和 CPU 100% 关系 常用 JVM 性能检测工具 Eclipse Memory Analyer、JProfile、JProbe
这些工具包括 Plumbr 、Eclipse Memory Analyzer、JProbe Profiler、JVisualVM 等。 06.
常用 JVM 性能检测工具 Eclipse Memory Analyer、JProfile、JProbe Profiler、JVisualVM、JConsole、Plumbr 参考 一次完整的
这些工具包括 Plumbr 、Eclipse Memory Analyzer、JProbe Profiler、JVisualVM 等。 06.
函数将在被探测指令被执行前回调; (2)post_handler 会在被探测指令执行完毕后回调(注意不是被探测函数); (3)fault_handler 会在内存访问出错时被调用; 2、Jprobe 其中最基本的便是 Kprobe 机制,Jprobe 以及 Kretprobe的实现都依赖于 Kprobe,作为 Linux 内核的一个重要的特性,Kprobe 是其他内核调试工具(perf,systemtap
JProbe-分析Java的内存泄漏。 3. JProfiler-一个全功能的Java剖析工具,专用于分析J2SE和J2EE应用程序。