微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

预加载库函数调用者的行号

如何解决预加载库函数调用者的行号

假设我有一个程序 (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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?