我正在编写一些代码来存储每个内存分配的回溯。然后,我将这些列表写入文件以进行离线分析。在win32中我使用_AddressOfReturnAddress
然后手动创建回溯。由于我使用的每次运行的地址都是随机的GetModuleInformation
and lpBaseOfDll
来获取基地址。这在没有 FPO 的 x86 上效果很好,这对我来说已经足够了。然后,我使用 win32 API 加载 PDB,将地址转换为函数名称。
我将如何在 Linux 上执行此操作?我目前的方法是使用__builtin_return_address(x)
and addr2line
离线获得相同的结果。问题是每次运行的地址都是随机的,所以addr2line
不理解他们。__executable_start
不起作用,因为每次运行都会返回相同的值。有什么方法可以在运行时获取可执行文件的基地址吗?
一次运行给了我这个:
__executable_start: 0x8048000
backtrace:
0x9cce628
0x9cce2b8
0x9cce260
0x9cce1f8
0x9cce138
0x9cce0c8
0x9cce060
0x9cce008
下一个:
__executable_start: 0x8048000
backtrace:
0x8db6628
0x8db62b8
0x8db6260
0x8db61f8
0x8db6138
0x8db60c8
0x8db6060
0x8db6008
等等。
您可以使用dl_iterate_phdr()
在Linux上确定每个动态加载对象的加载地址:
#define _GNU_SOURCE
#include <stdio.h>
#include <link.h>
int callback(struct dl_phdr_info *info, size_t size, void *data)
{
printf("%s @ %#lx\n", info->dlpi_name, (unsigned long)info->dlpi_addr);
return 0;
}
int main()
{
dl_iterate_phdr(&callback, NULL);
return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)