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

目录
相关文章
Idea在debug时打上断点没有用 Skipped breakpoint at ... because it happened inside debugger evaluation
Idea在debug时打上断点没有用 Skipped breakpoint at ... because it happened inside debugger evaluation
1584 0
|
开发工具
【错误记录】Flutter 插件报错 ( Methods marked with @UiThread must be executed on the main thread. | 更新最新 SDK )(一)
【错误记录】Flutter 插件报错 ( Methods marked with @UiThread must be executed on the main thread. | 更新最新 SDK )(一)
857 0
【错误记录】Flutter 插件报错 ( Methods marked with @UiThread must be executed on the main thread. | 更新最新 SDK )(一)
|
11月前
|
网络协议 Android开发 虚拟化
Android Studio无法运行程序调试程序出现Unable to connect to ADB.Check the Event Log for possible issues.Verify th
Android Studio无法运行程序调试程序出现Unable to connect to ADB.Check the Event Log for possible issues.Verify th
102 0
Android Studio无法运行程序调试程序出现Unable to connect to ADB.Check the Event Log for possible issues.Verify th
|
Android开发
意外导致了gradle project sync failed. Basic functionality will not work properly
意外导致了gradle project sync failed. Basic functionality will not work properly
意外导致了gradle project sync failed. Basic functionality will not work properly
【UVM源码学习】uvm_recorder
【UVM源码学习】uvm_recorder
269 0
【UVM源码学习】uvm_recorder
|
前端开发 机器人
outdoor_flight_gazebo.launch源码阅读
在hector_quadrotor-kinetic-devel里的hector_quadrotor_demo功能包,该功能包应该是可以在gazebo中仿真无人机飞行的。里面的launch文件夹里的launch文件应该可以直接执行相应功能。
outdoor_flight_gazebo.launch源码阅读
|
开发工具
【错误记录】Flutter 插件报错 ( Methods marked with @UiThread must be executed on the main thread. | 更新最新 SDK )(二)
【错误记录】Flutter 插件报错 ( Methods marked with @UiThread must be executed on the main thread. | 更新最新 SDK )(二)
332 0
【错误记录】Flutter 插件报错 ( Methods marked with @UiThread must be executed on the main thread. | 更新最新 SDK )(二)
|
Android开发
【错误记录】Android NDK 错误排查记录 ( error: undefined reference to | Linking CXX shared library FAILED )
【错误记录】Android NDK 错误排查记录 ( error: undefined reference to | Linking CXX shared library FAILED )
885 0
|
监控 开发工具 iOS开发
对比Xcode Debug Memory Graph和FBMemoryProfiler
内存泄露一直是一个头疼的问题,需要工程化的阶段来解决。之前在每个VC的deinit打印一些日志,因为日志太多,看到泄露信息并不容易。跑Instruments成本也比较高,很多时候并不想去跑。所以对比了一下Memory Debug Graph和[FBMemoryProfiler](https://github.com/facebook/FBMemoryProfiler)。 ### Memory
3652 0