在我正在开发的跟踪工具中,我使用 libC backtrace
函数从某些位置获取堆栈中的返回指针列表(void*
数组)执行中的点。然后,这些指针列表将存储在字典中并与唯一的整数关联。
问题:从程序的一次执行到另一次执行,程序的代码可能位于内存中的其他位置,因此从一次执行到回溯的特定调用的指针数组将发生变化到另一个,尽管程序执行了相同的事情。
部分解决方案:获取引用函数的地址(例如,main
)并将该函数的地址与回溯中的地址之间的差异存储起来原始地址。
新问题:如果程序使用动态加载的库,这些库的代码在内存中的位置可能在每次执行时都不同,因此相对于引用函数的地址存在差异将会改变。
有什么建议可以解决这个问题吗? (我想过使用 backtrace_symbols 函数来获取函数的名称而不是返回地址,但是只有名称可用时,该函数才会返回名称,例如,如果程序已使用 -g
)。
最佳答案
在 Linux 上,我建议还查看/proc/self/maps(如果您正在查看另一个进程,则查看/proc/pid/maps)以获取所有进程的负载映射动态库以及主要可执行文件。然后,您可以将回溯中的 void * 映射到它们所属的对象,以及距对象开头的偏移量。
类似的东西可能在其他操作系统上可用(许多 UNIX 变体都有一个/proc 文件系统,可能包含类似的信息)
关于c - 与执行无关的回溯地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29148560/