原因是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
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 函数获取调用堆栈信息。具体步骤如下:
- 在代码中调用 backtrace 函数获取调用堆栈信息,并将其存储在一个指针数组中,例如:
void *buffer[100]; int size = backtrace(buffer, 100);
- 这段代码会获取当前线程的调用堆栈信息,最多获取 100 层调用堆栈信息,并将其存储在 buffer 数组中。返回值 size 表示实际获取到的调用堆栈层数。
- 使用 backtrace_symbols 函数将调用堆栈信息转换成可读的字符串形式,例如:
char **strings = backtrace_symbols(buffer, size); for (int i = 0; i < size; i++) { printf("%s\n", strings[i]); } free(strings);
- 这段代码会将 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 函数需要注意以下几点:
- 由于 backtrace_symbols 返回一个动态分配的指针数组,因此在使用完毕后需要手动释放内存,以避免内存泄漏。可以使用 free 函数释放 backtrace_symbols 返回的指针数组。
- backtrace_symbols 在转换调用堆栈地址为字符串时,可能会失败而返回 NULL。因此在使用返回结果前,一定需要检查函数返回值是否为 NULL。
- backtrace_symbols 转换出来的字符串格式依赖于系统和编译器。具体来说,每个字符串通常包含函数名、源文件名和行号信息等。但这些信息并不总是可用或者准确,特别是在优化模式下,编译器可能会对代码进行各种优化,导致调用堆栈信息的丢失或变形。
backtrace_symbols 函数通常与 backtrace 函数一起使用,前者用于将生成的调用堆栈地址数组转换为字符串数组,后者用于收集函数调用堆栈信息。这两个函数在代码调试和错误排查方面非常有用,可以帮助开发人员快速、准确地定位问题所在。