独立于执行的回溯地址

时间:2015-03-19 15:23:21

标签: c backtrace

在我正在开发的跟踪工具中,我使用libC backtrace函数从执行中的某些点获取堆栈中的返回指针列表(void*的数组)。然后,这些指针列表存储在字典中并与唯一的整数相关联。

问题:从程序执行到另一个程序,程序的代码可能位于内存中的其他位置,因此从特定调用到回溯的指针数组将从执行中改变对另一个人来说,虽然程序执行了同样的事情。

部分解决方案:获取引用函数的地址(例如main)并存储此函数的地址与回溯中的地址之间的差异,而不是原始地址地址。

新问题:如果程序使用动态加载的库,这些库的代码在内存中的位置可能因执行而异,因此地址与参考函数的区别会改变。

有任何解决此问题的建议吗? (我想使用backtrace_symbols函数来获取函数的名称而不是返回地址,但是这个函数只有在它们可用时才会返回名称,例如,如果程序是用-g编译的)。

1 个答案:

答案 0 :(得分:1)

在Linux上,我建议还要查看/ proc / self / maps(或/ proc / pid / maps,如果你正在查看另一个进程)来获取所有的加载映射动态库,以及主要的可执行文件。然后,您可以将回溯中的void *映射到它们所属的对象,并从对象的开始处偏移。

其他操作系统上可能有类似的东西(许多UNIX变种都有/ proc文件系统,可能包含类似的信息)