基于uprobe的调试调优浅析

news/2024/11/17 4:23:44/

uprobe与krobe对应,动态附加到用户态调用函数的切入点称为uprobe,相比如kprobe 内核函数的稳定性,uprobe 的函数由开发者定义。uprobe是用户态的探针,它和kprobe是相对应的,kprobe是内核态的探针。uprobe需要制定用户态探针在执行文件中的位置,插入探针的原理和kprobe类似。

下面是对uprobe使用方法的简单介绍。比如跟踪下面程序中的callee函数调用:

#include <stdio.h>int callee(void)
{printf("hello world.\n");return 0;
}int main(void)
{    callee();return 0;
}

Makefile

分别编译地址加载无关和地址相关两个版本的应用程序,分别抓取其PROBE结果。

all:gcc -O0 -no-pie -fno-pic -g main.c -o main-nopiegcc -O0 -g main.c -o main
clean:rm -fr main main-nopie

增加一个新的uprobe event,命令如下(在可执行文件main的0x63a偏移处增加一个uprobe探针),当callee函数被调用时,截获调用事件信息:

$ readelf -s main|grep callee64: 000000000000063a    23 FUNC    GLOBAL DEFAULT   14 callee
$ 
# echo 'p:callee /home/zlcao/uprobe/main:0x63a' > /sys/kernel/debug/tracing/uprobe_events

增加一个返回事件信息:

echo 'r:callee_ret /home/zlcao/uprobe/main:0x63a' >> /sys/kernel/debug/tracing/uprobe_events

之后使用如下命令查看注册的EVENT事件

cat /sys/kernel/debug/tracing/uprobe_events

定义以后,使能所有的events:

echo 1 > /sys/kernel/debug/tracing/events/uprobes/enable

之后执行测试用例,执行完毕后,通过如下命令查看探测记录。

cat /sys/kernel/debug/tracing/trace

可以看到,callee函数的调用和返回事件都被触发了,输出显示给我们uprobe被触发时:main-27731、程序PC 0x55f1b22cb63a,uretprobe被触发时:PC从函数入口0x55f1b22cb63a返回0x55f1b22cb65a。

之后,通过如下命令关闭探测。

echo 0 > /sys/kernel/debug/tracing/events/uprobes/enable

最后,使用如下命令清除掉所有注册的events。

echo > /sys/kernel/debug/tracing/uprobe_events

添加探测点的步骤比较麻烦,perf很贴心地添加了一键添加探测点的功能,只需要执行一个简单的命令即可:

# perf probe -x ./main-nopie callee
# perf probe -x ./main-nopie callee%return

之后使能探测,运行用例。

 echo 1 > /sys/kernel/debug/tracing/events/probe_main/enable

PIE和NO-PIE应用的区别

通过上面的例子可以看到,默认编译的PIE应用和非PIE应用都可以被事件机制探测调试,那么它们的区被是什么呢?通过下面几幅图可以看出,PIE应用的符号地址是相对的,加载地址是随机的,而非PIE应用的加载地址和运行地址完全是由应用符号表提供的,运行时加载器必须遵守,不能更改。


参考资料

Linux内核文档,Documentation/trace/uprobetracer.rst

结束

http://www.ppmy.cn/news/539718.html

相关文章

尼日利亚4g频段_全球主要4G频段资料全解.doc

全球主要4G频段资料全解 OperatorCountry(MHz)BandDuplexmodeLaunchdateAlgerie Telecom?Algeria阿尔及利亚(?)(?)TDDMay 2014Movicel?Angola安哥拉18003FDDApr 2012Unitel?Angola21001FDDDec 2012Surfline?Ghana加纳26007FDDAug 2014YooMee?Ivory Coast象牙海岸230040T…

4G网速实测与WIFI使用对比

5G即将普及&#xff0c;4G数据也基本能够满足需要&#xff0c;实测为日常使用地点&#xff08;两处&#xff09;和办公室WIFI&#xff0c;如果要求时延低&#xff0c;任何场合都推荐光钎&#xff0c;wifi和4g信号时延都要明显高于有线网络。 在线测网速链接&#xff1a;http:/…

# Android12 wifi和4G同时使用

Android12 wifi和4G同时使用 1.新建device/qcom/qssi/wifiand4g.sh #! /system/bin/sh ip rule add from all lookup main pref 100 2.device/qcom/项目名/init.target.rc中加入 on property:sys.startwifiand4gyes start wifiand4g service wifiand4g /system/bin/wifiand4g…

Linux驱动开发|4G通信

4G通信 使用有线网络或者 WIFI 有很多限制&#xff0c;因为要布线&#xff0c;即使是 WIFI 也得先布线&#xff0c;然后接个路由器。因此在不方便布线的场合&#xff0c;就可以通过 4G 连接到网络。下面介绍如何在 I.MX6U-ALPHA 开发板中使用 4G 来实现联网功能 一、4G网络连…

oracle 日志大于4g,Oracle日志文件达到4G

解决方案一:停止监听器 1)LSNRCTL进入交互模式 cmd 输入 LSNRCTL 2)执行set current_listener LISTENER 3)set log_status off 4)stop 停止监听器 5)手工删除ADR指定的监听日志路径下的listener.log文件 6)start重启监听器 7)status查看状态 解决方案二:脚本定时清除log文件 …

[4G5G专题-27]:架构-UE终端的4G+5G双连接详解

目录 第1章. 什么是多连接 1.1 多连接概述 1.2 多连接的聚合和分离点的分类 1.3 多连接好处 1.4 双连接的本质 1.5 多连接的控制面与数据面连接方法分类 1.6 1C2U模式下数据承载的三种方式 1.7 分清各种场景的基本思路 1.8 关于终端与基站之间的无线控制信道 第2章 4…

Python基础篇(十一):装饰器

装饰器 前言1. 装饰器的定义2. 装饰器的应用3. 装饰器的语法4. func(*args, **kwargs) 前言 装饰器是Python中一种强大的函数或类修饰机制&#xff0c;用于在不修改原始函数或类代码的情况下&#xff0c;对其进行功能扩展或修改。装饰器基于函数式编程的概念&#xff0c;通过将…

4G和5G频谱共享技术

【摘 要】目前4G向5G重耕过程中存在频谱利用不平衡的问题,可采用动态频谱共享的技术解决。基于对现有频谱共享方案的原理分析,通过理论测算和实验室测试结合的方法研究终端和基站各功能特性对于终端性能的影响。动态频谱共享对下行影响较大,对上行影响较小,不同功能选择会…