[√]leak-tracer源码使用到的函数

简介: [√]leak-tracer源码使用到的函数

image.png

原因是lib.so和leak_tracer_report.txt不对应导致的

查看so是否携带调试信息

file libnative-lib.so
libnative-lib.so: 
    ELF 64-bit LSB shared object, 
    ARM aarch64, 
    version 1 (SYSV), 
    dynamically linked, 
    BuildID[sha1]=054093c74a92bf97c4766843479b5fb44893a4aa, 
    with debug_info, # 这个表示带有调试信息
    not stripped

image.png

leak的汇报结果

# LeakTracer report diff_utc_mono=1685283948.471360
leak, time=1516474.439945, stack=0x79207c945c 0x79207c96ec 0x79207c12e0 0x798f2c1ed8 0x12c4458800000000, size=10485760, data=..................................................
leak, time=1516474.972916, stack=0x79207c945c 0x79207c96ec 0x79207c12e0 0x798f2c1ed8 0x12c4458800000000, size=10485760, data=..................................................
leak, time=1516474.714272, stack=0x79207c945c 0x79207c96ec 0x79207c12e0 0x798f2c1ed8 0x12c4458800000000, size=10485760, data=..................................................
leak, time=1516474.139266, stack=0x79207c945c 0x79207c96ec 0x79207c12e0 0x798f2c1ed8 0x12c4458800000000, size=10485760, data=..................................................
leak, time=1516475.155904, stack=0x79207c945c 0x79207c96ec 0x79207c12e0 0x798f2c1ed8 0x12c4458800000000, size=10485760, data=..................................................
leak, time=1516475.155908, stack=0x79207c945c 0x79207c9344 0x79207c2270 0x79207c3e88 0x79207c3d9c, size=64, data=...{y.....`.y.....`.y...@. .y...@...y...ialButton

backtrace 函数

在计算机科学中,backtrace(也称为调用堆栈)是一种最常见的调试技术,通常被用于查找程序运行时出现错误的位置和原因。backtrace 展示了程序在执行过程中调用了哪些函数、以及函数之间的调用关系。

在 C/C++ 语言中,可以使用 backtrace 函数和 backtrace_symbols 函数获取调用堆栈信息。具体步骤如下:

  1. 在代码中调用 backtrace 函数获取调用堆栈信息,并将其存储在一个指针数组中,例如:
void *buffer[100];
int size = backtrace(buffer, 100);
  1. 这段代码会获取当前线程的调用堆栈信息,最多获取 100 层调用堆栈信息,并将其存储在 buffer 数组中。返回值 size 表示实际获取到的调用堆栈层数。
  2. 使用 backtrace_symbols 函数将调用堆栈信息转换成可读的字符串形式,例如:
char **strings = backtrace_symbols(buffer, size);
for (int i = 0; i < size; i++) {
    printf("%s\n", strings[i]);
}
free(strings);
  1. 这段代码会将 buffer 数组中的调用堆栈信息转换成可读的字符串形式,并依次输出到控制台上。需要注意的是,backtrace_symbols 函数返回的字符串数组需要手动释放内存,否则会造成内存泄漏。

使用 backtrace 可以帮助我们快速、准确地定位代码中的错误位置和原因,并帮助我们及时解决问题。不过需要注意的是,在生产环境下,应该尽量避免将调用堆栈信息输出到控制台上,避免泄露敏感信息。

backtrace_symbols

backtrace_symbols 是一个 C/C++ 标准库函数,用于将给定的调用堆栈地址数组转换为可读的字符串数组。

backtrace_symbols 函数的函数签名如下:

char **backtrace_symbols(void *const *buffer, int size);

其中,buffer 是存储调用堆栈地址的指针数组,size 是指针数组中元素的个数,即调用堆栈的深度。函数返回一个 char* 指针数组,存储将指针数组中的地址转换后的可读字符串,表示对应函数的调用堆栈信息。

使用 backtrace_symbols 函数需要注意以下几点:

  1. 由于 backtrace_symbols 返回一个动态分配的指针数组,因此在使用完毕后需要手动释放内存,以避免内存泄漏。可以使用 free 函数释放 backtrace_symbols 返回的指针数组。
  2. backtrace_symbols 在转换调用堆栈地址为字符串时,可能会失败而返回 NULL。因此在使用返回结果前,一定需要检查函数返回值是否为 NULL。
  3. backtrace_symbols 转换出来的字符串格式依赖于系统和编译器。具体来说,每个字符串通常包含函数名、源文件名和行号信息等。但这些信息并不总是可用或者准确,特别是在优化模式下,编译器可能会对代码进行各种优化,导致调用堆栈信息的丢失或变形。

backtrace_symbols 函数通常与 backtrace 函数一起使用,前者用于将生成的调用堆栈地址数组转换为字符串数组,后者用于收集函数调用堆栈信息。这两个函数在代码调试和错误排查方面非常有用,可以帮助开发人员快速、准确地定位问题所在。

目录
相关文章
|
设计模式 测试技术 编译器
C++项目中打破循环依赖的锁链:实用方法大全(一)
C++项目中打破循环依赖的锁链:实用方法大全
1489 0
|
Linux 关系型数据库 Oracle
|
5月前
|
Java Android开发 C++
复杂项目即时通讯从android 5升级android x后遗症之解决报错#1057 SIGABRT #00 pc 0000000000073898-优雅草卓伊凡|bigniu
复杂项目即时通讯从android 5升级android x后遗症之解决报错#1057 SIGABRT #00 pc 0000000000073898-优雅草卓伊凡|bigniu
244 2
 复杂项目即时通讯从android 5升级android x后遗症之解决报错#1057 SIGABRT #00 pc 0000000000073898-优雅草卓伊凡|bigniu
|
人工智能 JSON API
利用TTS技术让你的AI Agent发声
【10月更文挑战第5天】
914 4
利用TTS技术让你的AI Agent发声
|
消息中间件 搜索推荐 RocketMQ
消息队列 MQ使用问题之如何将一个主题的多个分区分布到不同的Broker上
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
Linux Python Windows
conda基本指令
安装虚拟环境conda基本指令
545 0
|
缓存 JavaScript 算法
历时两天半由浅入深总结了20道Vue高频面试题
历时两天半由浅入深总结了20道Vue高频面试题
479 1
|
数据采集 开发者 iOS开发
推荐5款实用主义的小工具软件
今天来些有意思的小工具,有时候一些小工具,能给你带来一些意想不到的效果,大家按需下载。
458 0
推荐5款实用主义的小工具软件
SVN遗漏so文件的解决办法
SVN遗漏so文件的解决办法
565 0
SVN遗漏so文件的解决办法