[√]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
1755 0
|
Android开发
【错误记录】Android Studio 编译报错 ( VirtualApp 编译 NDK 报错 | Error:A problem occurred configuring project ‘: )(一)
【错误记录】Android Studio 编译报错 ( VirtualApp 编译 NDK 报错 | Error:A problem occurred configuring project ‘: )(一)
877 0
【错误记录】Android Studio 编译报错 ( VirtualApp 编译 NDK 报错 | Error:A problem occurred configuring project ‘: )(一)
|
编译器 API C++
[√]vld编译Release遇到的各种问题
[√]vld编译Release遇到的各种问题
85 0
NDK编译doubango时出现错误:undefined reference to ‘stderr‘
NDK编译doubango时出现错误:undefined reference to ‘stderr‘
140 0
解决办法:GTK+ 2.x symbols detected
解决办法:GTK+ 2.x symbols detected
363 0
|
开发工具 Android开发
【错误记录】Visual Studio 中编译 NDK 报错 ( no matching function for call to ‘cacheflush‘ cacheflush(); )
【错误记录】Visual Studio 中编译 NDK 报错 ( no matching function for call to ‘cacheflush‘ cacheflush(); )
258 0
【错误记录】Visual Studio 中编译 NDK 报错 ( no matching function for call to ‘cacheflush‘ cacheflush(); )
|
开发工具 Android开发
【错误记录】Android Studio 编译报错 ( VirtualApp 编译 NDK 报错 | Error:A problem occurred configuring project ‘: )(二)
【错误记录】Android Studio 编译报错 ( VirtualApp 编译 NDK 报错 | Error:A problem occurred configuring project ‘: )(二)
331 0
【错误记录】Android Studio 编译报错 ( VirtualApp 编译 NDK 报错 | Error:A problem occurred configuring project ‘: )(二)
|
监控 开发工具 iOS开发
对比Xcode Debug Memory Graph和FBMemoryProfiler
内存泄露一直是一个头疼的问题,需要工程化的阶段来解决。之前在每个VC的deinit打印一些日志,因为日志太多,看到泄露信息并不容易。跑Instruments成本也比较高,很多时候并不想去跑。所以对比了一下Memory Debug Graph和[FBMemoryProfiler](https://github.com/facebook/FBMemoryProfiler)。 ### Memory
3664 0
|
Windows
用WinDbg分析Debug Diagnostic Tool生成的Userdump文件
1、下载WinDbg(Debugging Tools for Windows) 2、安装WinDbg 3、运行WinDbg 4、配置Symbol文件路径: File&gt;Symbol File Path,输入:SRV*c:\websymbols*http://msdl.
1067 0