c - 与执行无关的回溯地址

标签 c backtrace

在我正在开发的跟踪工具中,我使用 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/

相关文章:

python - 如何在没有回溯的情况下重新引发相同的异常?

Linux(MIPS): Temporarily "change" register contents when viewing core dump

assembly - GDB - 它如何知道函数调用堆栈?

c++ - 在 C++ 中打印完整的回溯

php - 如何将 PHP 回溯保存到错误日志中?

c - 在 Linux 环境下使用 C 语言进行 Fork 编程

c - 警告 C4172 : returning address of local variable or temporary

我可以有条件地定义 openMP 并行区域吗?

c - 为什么我的C多线程调度程序出现段错误(核心转储)

c - 对使用 RTOS 的项目进行单元测试