用户静态定义探测点USDT
usdt(User-Statically-Defined-Tracepoint)是一种向应用插入跟踪点的技术方案,其特点是跟踪点的插入是静态的,通常需要修改应用的源码并再次编译。该技术方案源于DTrace,不过usdt应用跟踪的功能在Systemtap和bcc等内核跟踪调试工具中已有良好的支持。Systemtap开源工具提供了sys/sdt.h头文件,该头文件没有相应用C代码实现,仅仅提供了多个STAP_PROBExxx和DTRACE_PROBExxx宏定义。这些宏定义通过GCC编译器的内联汇编和段操作在编译成生的ELF文件中加入一些用于跟踪的信息(主要加入一个nop机器指令和.note.stapsdt段信息)。当应用未被跟踪调试时,这些额外的信息不会影响应用的正常功能,也不会造成性能的消耗;当应用被跟踪调试时,Systemtap或bcc工具会通过Linux内核修改应用的代码段,将nop命令替换为陷入Linux内核或调试代码的指令;具体的实现请参考Systemtap的相关文档。
本文记录用笔者编写的简单usdt调试应用及在64位arm64/Linux设备上的调试过程。
跟踪应用层的内存申请与释放
在编写代码前,笔者需要在x86_64/Linux主机上两次编译Systemtap:分别为主机和嵌入式ARM设备编译;该操作这里不再详述。之后,笔者编写了以下代码mymalloc.c,使用sys/sdt.h中提供的宏,对应用的内存分配函数封装的同时,加入跟踪点:
#include <sys/sdt.h>
extern void * __libc_malloc(size_t);
extern void __libc_free(void * ptr);
extern void * __libc_calloc(size_t nmemb, size_t size);
extern voi

本文介绍了如何在64位ARM64/Linux设备上使用usdt技术静态定义探测点,对内存分配与释放进行跟踪,并通过Systemtap脚本捕获和分析应用行为。适合大型嵌入式应用开发中内存管理的调试。

336

被折叠的 条评论
为什么被折叠?



