在我正在开发的跟踪工具中,我使用libC backtrace
函数从执行中的某些点获取堆栈中的返回指针列表(void*
的数组)。然后,这些指针列表存储在字典中并与唯一的整数相关联。
问题:从程序执行到另一个程序,程序的代码可能位于内存中的其他位置,因此从特定调用到回溯的指针数组将从执行中改变对另一个人来说,虽然程序执行了同样的事情。
部分解决方案:获取引用函数的地址(例如main
)并存储此函数的地址与回溯中的地址之间的差异,而不是原始地址地址。
新问题:如果程序使用动态加载的库,这些库的代码在内存中的位置可能因执行而异,因此地址与参考函数的区别会改变。
有任何解决此问题的建议吗? (我想使用backtrace_symbols
函数来获取函数的名称而不是返回地址,但是这个函数只有在它们可用时才会返回名称,例如,如果程序是用-g
编译的)。
答案 0 :(得分:1)
在Linux上,我建议还要查看/ proc / self / maps(或/ proc / pid / maps,如果你正在查看另一个进程)来获取所有的加载映射动态库,以及主要的可执行文件。然后,您可以将回溯中的void *映射到它们所属的对象,并从对象的开始处偏移。
其他操作系统上可能有类似的东西(许多UNIX变种都有/ proc文件系统,可能包含类似的信息)