android上使用systemtap来调试native

本文介绍了使用SystemTap调试Linux内核的相关要求及使用示例。调试时,Linux内核需支持uprobe,版本最好在4.9以后,应用程序要有带符号表的可执行程序或动态库。还给出了编译脚本和执行时的文件路径要求,并展示了查看进程内存情况及调试内存泄漏的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对linux kernel的要求

因为是用来调试native,所以kernel必须支持uprobe,kernel版本做好在4.9以后,如果kernel版本没有支持uprobe
可以自己把相关代码cherry-pick过去。

对所要调试的应用程序要求

需要有带符号表的可执行程序或者动态库
一般在使用在out/target/product/xxx/symbols路径下的可执行程序或者动态库

下面举例来说明如何使用

global malloc_stack, free_stack
function filter_p()
  {
    if (pid() == target()) return 0; /*可以过滤需要调试的进程 */
    return 1;
  }
probe process("/system/lib64/libc.so").function("malloc")  //定义probe,需要trace的的函数 libc里的malloc
{
    if (filter_p()) next; //如果不是trace的进程直接退出
	//print_usyms(ubacktrace());
	//sprint_usyms(ubacktrace());
	malloc_stack[$bytes, sprint_usyms(ubacktrace())]<<<1; //哈希表,key:bytes,back trace;val : 该bytes下,相同调用路径下出现的次数
	//printf("=================%d,%s, %d %d %s\n",pid(),execname(), $bytes,@count(malloc_stack[$bytes, ubacktrace()]),sprint_usyms(ubacktrace()));

}
probe process("/system/lib64/libc.so").function("free") 
{
    if (filter_p()) next;
	//print_usyms(ubacktrace());
	free_stack[sprint_usyms(ubacktrace())]<<<1;
	//printf("=================%d,%s, %d\n",pid(),execname(),@count(free_stack[ubacktrace()]));

}
probe timer.s(15), end //每个15秒打印一次,或者CTL+C打印结果
{
  printf("\n------------------malloc-------------------------------------\n\n")
  foreach ([size, stack] in malloc_stack-) { //按照递减的打印
    printf("size: %d, times %d\n%s\n", size, @count(malloc_stack[size, stack]), stack)
  }
  printf("\n-------------------free-------------------------------------\n\n")
  foreach ([stack] in free_stack-) {
    printf("times %d\n%s\n",  @count(free_stack[stack]), stack)
  }
  delete malloc_stack
  delete free_stack
}

在编译该脚本的时候,需要在/system/lib64/路径上有相应的带符号表的可执行文件,动态库
执行的时候目标板上也需要有带符号的可执行文件动态库

这次我替换的文件有
/system/bin/linker64
/system/lib64/libc.so
可以使用改脚本来查看memtester 进程分配释放内存情况
也可以在改脚本基础上修改一下用来debug内存泄漏情况

下面是执行结果

/data/bin/staprun -c “/data/memtester 500m” malloc.ko

------------------malloc-------------------------------------

size: 32, times 72
 0x7406c3fdc4 : malloc+0x0/0x18 [/system/lib64/libc.so]
 0x7406c4f1e8 : _Znwm+0x14/0x34 [/system/lib64/libc.so]
 0x7406c4d7c4 : _ZL21initialize_propertiesv+0x1f8/0x2a0 [/system/lib64/libc.so]
 0x7406c4d3f0 : __system_properties_init+0x108/0x2e4 [/system/lib64/libc.so]
 0x7406c4053c : _ZL14__libc_preinitv+0x28/0xa8 [/system/lib64/libc.so]
 0x7406e509a8 : __dl__ZN6soinfo10call_arrayEPKcPPFvvEmb+0x16c/0x240 [/system/bin/linker64]

size: 25, times 55
 0x7406c3fdc4 : malloc+0x0/0x18 [/system/lib64/libc.so]
 0x7406c8c74c : strndup+0x24/0x54 [/system/lib64/libc.so]
 0x7406c4e608 : _ZL17read_spec_entriesPciz+0x180/0x1ec [/system/lib64/libc.so]
 0x7406c4d660 : _ZL21initialize_propertiesv+0x94/0x2a0 [/system/lib64/libc.so]
 0x7406c4d3f0 : __system_properties_init+0x108/0x2e4 [/system/lib64/libc.so]
 0x7406c4053c : _ZL14__libc_preinitv+0x28/0xa8 [/system/lib64/libc.so]
 0x7406e509a8 : __dl__ZN6soinfo10call_arrayEPKcPPFvvEmb+0x16c/0x240 [/system/bin/linker64]

size: 32, times 34
 0x7406c3fdc4 : malloc+0x0/0x18 [/system/lib64/libc.so]
 0x7406c4f1e8 : _Znwm+0x14/0x34 [/system/lib64/libc.so]
 0x7406c4d738 : _ZL21initialize_propertiesv+0x16c/0x2a0 [/system/lib64/libc.so]
 0x7406c4d3f0 : __system_properties_init+0x108/0x2e4 [/system/lib64/libc.so]
 0x7406c4053c : _ZL14__libc_preinitv+0x28/0xa8 [/system/lib64/libc.so]
 0x7406e509a8 : __dl__ZN6soinfo10call_arrayEPKcPPFvvEmb+0x16c/0x240 [/system/bin/linker64]

size: 40, times 34
 0x7406c3fdc4 : malloc+0x0/0x18 [/system/lib64/libc.so]
 0x7406c4f1e8 : _Znwm+0x14/0x34 [/system/lib64/libc.so]
 0x7406c4d6c4 : _ZL21initialize_propertiesv+0xf8/0x2a0 [/system/lib64/libc.so]
 0x7406c4d3f0 : __system_properties_init+0x108/0x2e4 [/system/lib64/libc.so]
 0x7406c4053c : _ZL14__libc_preinitv+0x28/0xa8 [/system/lib64/libc.so]
 0x7406e509a8 : __dl__ZN6soinfo10call_arrayEPKcPPFvvEmb+0x16c/0x240 [/system/bin/linker64]

size: 26, times 18
 0x7406c3fdc4 : malloc+0x0/0x18 [/system/lib64/libc.so]
 0x7406c8c74c : strndup+0x24/0x54 [/system/lib64/libc.so]
 0x7406c4e608 : _ZL17read_spec_entriesPciz+0x180/0x1ec [/system/lib64/libc.so]
 0x7406c4d660 : _ZL21initialize_propertiesv+0x94/0x2a0 [/system/lib64/libc.so]
 0x7406c4d3f0 : __system_properties_init+0x108/0x2e4 [/system/lib64/libc.so]
 0x7406c4053c : _ZL14__libc_preinitv+0x28/0xa8 [/system/lib64/libc.so]
 0x7406e509a8 : __dl__ZN6soinfo10call_arrayEPKcPPFvvEmb+0x16c/0x240 [/system/bin/linker64]

size: 29, times 15
 0x7406c3fdc4 : malloc+0x0/0x18 [/system/lib64/libc.so]
 0x7406c8c74c : strndup+0x24/0x54 [/system/lib64/libc.so]
 0x7406c4e608 : _ZL17read_spec_entriesPciz+0x180/0x1ec [/system/lib64/libc.so]
 0x7406c4d660 : _ZL21initialize_propertiesv+0x94/0x2a0 [/system/lib64/libc.so]
 0x7406c4d3f0 : __system_properties_init+0x108/0x2e4 [/system/lib64/libc.so]
 0x7406c4053c : _ZL14__libc_preinitv+0x28/0xa8 [/system/lib64/libc.so]
 0x7406e509a8 : __dl__ZN6soinfo10call_arrayEPKcPPFvvEmb+0x16c/0x240 [/system/bin/linker64]

size: **524288000**, times 1 //**这个500m 就是开始执行memtester时申请的500m,下面就是调用路径**
 0x7406c3fdc4 : malloc+0x0/0x18 [/system/lib64/libc.so]
 0x5a473ca3d0 : main+0x41c/0x908 [/data/memtester]
 0x7406c40618 : __libc_init+0x5c/0x60 [/system/lib64/libc.so]
 0x5a473c9ee4 : _start+0x0/0x8 [/data/memtester]

size: 30, times 1
 0x7406c3fdc4 : malloc+0x0/0x18 [/system/lib64/libc.so]
 0x7406c8c6f4 : strdup+0x28/0x5c [/system/lib64/libc.so]
 0x7406c4d7d4 : _ZL21initialize_propertiesv+0x208/0x2a0 [/system/lib64/libc.so]
 0x7406c4d3f0 : __system_properties_init+0x108/0x2e4 [/system/lib64/libc.so]
 0x7406c4053c : _ZL14__libc_preinitv+0x28/0xa8 [/system/lib64/libc.so]
 0x7406e509a8 : __dl__ZN6soinfo10call_arrayEPKcPPFvvEmb+0x16c/0x240 [/system/bin/linker64]
-------------------free-------------------------------------

times 121
 0x7406c3fd94 : free+0x0/0x18 [/system/lib64/libc.so]
 0x7406c4d804 : _ZL21initialize_propertiesv+0x238/0x2a0 [/system/lib64/libc.so]
 0x7406c4d3f0 : __system_properties_init+0x108/0x2e4 [/system/lib64/libc.so]
 0x7406c4053c : _ZL14__libc_preinitv+0x28/0xa8 [/system/lib64/libc.so]
 0x7406e509a8 : __dl__ZN6soinfo10call_arrayEPKcPPFvvEmb+0x16c/0x240 [/system/bin/linker64]
 0x7406e4eb64 : __dl__ZN6soinfo17call_constructorsEv+0x90/0x1a0 [/system/bin/linker64]

times 121
 0x7406c3fd94 : free+0x0/0x18 [/system/lib64/libc.so]
 0x7406c4d7fc : _ZL21initialize_propertiesv+0x230/0x2a0 [/system/lib64/libc.so]
 0x7406c4d3f0 : __system_properties_init+0x108/0x2e4 [/system/lib64/libc.so]
 0x7406c4053c : _ZL14__libc_preinitv+0x28/0xa8 [/system/lib64/libc.so]
 0x7406e509a8 : __dl__ZN6soinfo10call_arrayEPKcPPFvvEmb+0x16c/0x240 [/system/bin/linker64]
 0x7406e4eb64 : __dl__ZN6soinfo17call_constructorsEv+0x90/0x1a0 [/system/bin/linker64]

times 16
 0x7406c3fd94 : free+0x0/0x18 [/system/lib64/libc.so]
 0x7406c82ce0 : __vfprintf+0x2b1c/0x2c74 [/system/lib64/libc.so]
 0x7406c80184 : vfprintf+0x64/0xa4 [/system/lib64/libc.so]
 0x7406c7f038 : printf+0x94/0xb4 [/system/lib64/libc.so]
 0x5a473caa0c : test_stuck_address+0x5c/0x210 [/data/memtester]
 0x5a473ca620 : main+0x66c/0x908 [/data/memtester]
 0x7406c40618 : __libc_init+0x5c/0x60 [/system/lib64/libc.so]
 0x5a473c9ee4 : _start+0x0/0x8 [/data/memtester]

times 16
 0x7406c3fd94 : free+0x0/0x18 [/system/lib64/libc.so]
 0x7406c82ce0 : __vfprintf+0x2b1c/0x2c74 [/system/lib64/libc.so]
 0x7406c80184 : vfprintf+0x64/0xa4 [/system/lib64/libc.so]
 0x7406c7f038 : printf+0x94/0xb4 [/system/lib64/libc.so]
 0x5a473caa1c : test_stuck_address+0x6c/0x210 [/data/memtester]
 0x5a473ca620 : main+0x66c/0x908 [/data/memtester]
 0x7406c40618 : __libc_init+0x5c/0x60 [/system/lib64/libc.so]
 0x5a473c9ee4 : _start+0x0/0x8 [/data/memtester]

times 16
 0x7406c3fd94 : free+0x0/0x18 [/system/lib64/libc.so]
 0x7406c82ce0 : __vfprintf+0x2b1c/0x2c74 [/system/lib64/libc.so]
 0x7406c80184 : vfprintf+0x64/0xa4 [/system/lib64/libc.so]
 0x7406c7f038 : printf+0x94/0xb4 [/system/lib64/libc.so]
 0x5a473caa64 : test_stuck_address+0xb4/0x210 [/data/memtester]
 0x5a473ca620 : main+0x66c/0x908 [/data/memtester]
 0x7406c40618 : __libc_init+0x5c/0x60 [/system/lib64/libc.so]
 0x5a473c9ee4 : _start+0x0/0x8 [/data/memtester]

times 16
 0x7406c3fd94 : free+0x0/0x18 [/system/lib64/libc.so]
 0x7406c82ce0 : __vfprintf+0x2b1c/0x2c74 [/system/lib64/libc.so]
 0x7406c80184 : vfprintf+0x64/0xa4 [/system/lib64/libc.so]
 0x7406c7f038 : printf+0x94/0xb4 [/system/lib64/libc.so]
 0x5a473caa54 : test_stuck_address+0xa4/0x210 [/data/memtester]
 0x5a473ca620 : main+0x66c/0x908 [/data/memtester]
 0x7406c40618 : __libc_init+0x5c/0x60 [/system/lib64/libc.so]
 0x5a473c9ee4 : _start+0x0/0x8 [/data/memtester]

times 8
 0x7406c3fd94 : free+0x0/0x18 [/system/lib64/libc.so]
 0x7406c82ce0 : __vfprintf+0x2b1c/0x2c74 [/system/lib64/libc.so]
 0x7406c80184 : vfprintf+0x64/0xa4 [/system/lib64/libc.so]
 0x7406c7f038 : printf+0x94/0xb4 [/system/lib64/libc.so]
 0x5a473ca668 : main+0x6b4/0x908 [/data/memtester]
 0x7406c40618 : __libc_init+0x5c/0x60 [/system/lib64/libc.so]
 0x5a473c9ee4 : _start+0x0/0x8 [/data/memtester]

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值