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

目录
相关文章
|
3月前
|
JavaScript
Playwright系列(4):Trace Viewer
Playwright系列(4):Trace Viewer
Playwright系列(4):Trace Viewer
|
4月前
|
网络协议 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
63 0
Android Studio无法运行程序调试程序出现Unable to connect to ADB.Check the Event Log for possible issues.Verify th
|
5月前
|
编译器 Go 开发工具
JetBrains GoLand 以debug运行Go程序时出现could not launch process: decoding dwarf section info at offset 0x0: too short报错之保姆级别解决方案
JetBrains GoLand 以debug运行Go程序时出现could not launch process: decoding dwarf section info at offset 0x0: too short报错之保姆级别解决方案
56 0
【UVM源码学习】uvm_recorder
【UVM源码学习】uvm_recorder
153 0
【UVM源码学习】uvm_recorder
|
Android开发
【错误记录】Android NDK 错误排查记录 ( error: undefined reference to | Linking CXX shared library FAILED )
【错误记录】Android NDK 错误排查记录 ( error: undefined reference to | Linking CXX shared library FAILED )
773 0
|
Web App开发
Reuse library debug in Chrome - phase1 init phase
Reuse library debug in Chrome - phase1 init phase
82 0
Reuse library debug in Chrome - phase1 init phase
|
Windows
用WinDbg分析Debug Diagnostic Tool生成的Userdump文件
1、下载WinDbg(Debugging Tools for Windows):http://www.microsoft.com/whdc/devtools/debugging/default.mspx 2、安装WinDbg 3、运行WinDbg 4、配置Symbol文件路径: File>Symbol File Path,输入:SRV*c:\websymbols*http://msdl.
1041 0