如何解决预加载库函数调用者的行号
假设我有一个程序 (program.c),它使用标准 C 库中的 rand 函数。
1 #include <stdlib.h>
2 int main(){
3 int rand_number = rand();
4 }
我还创建了一个共享库 (intercept.c),用于更改标准库中 rand 函数的行为(简单地将 +1 添加到结果中)。
int rand(void){
int (*rand_func)();
rand_func = dlsym(RTLD_NEXT,"rand");
int result = (*rand_func)();
return result + 1;
}
我用
运行程序LD_PRELOAD=./intercept.so ./program
有没有什么方法可以在不修改program.c的源代码的情况下获取行号(第3行)和调用者函数(main)的名称?
解决方法
它不是即时的,但您可以使用 backtrace()
来获取调用堆栈中的每一帧。
然后调用外部命令 eu-addr2line -f -C -s --pretty-print -p your_pid the_previous_frames...
(使用 popen()
或 pipe()/fork()/dup2()/exec()...
)并解析其输出将提供您需要的信息
(如果使用 -g
编译)。
关于:
有没有什么方法可以在不修改program.c的源代码的情况下获得行号(第3行)和调用者函数(main)的名称?
使用 -ggdb3
选项编译程序,然后在要停止程序的位置设置断点。然后使用回溯命令 bt
。这将显示函数名称、行号等
另一种(Linux 特定的)方法是使用 GCC 和 Ian Taylor 出色的 libbacktrace 使用 -g
(也许还有 -O
)编译所有内容。
该库解析 DWARF 调试信息并知道行号。
您需要几个小时才能理解 libbacktrace
(仔细阅读头文件)。我在 RefPerSys
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。