【问题标题】:While inside a function, how do I get its return address?在函数内部,如何获取其返回地址?
【发布时间】:2016-03-29 00:38:00
【问题描述】:

我正在寻找创建调用此函数的内存位置列表。这段代码是否正确?如何改进?假设整数、长整数和指针是 4 个字节,char 是 1 个字节。假设没有执行编译器优化。假设函数使用/设置其参数、返回值和局部变量。

void * CalledFromArray[ARRAY_SIZE];
int CallerRecorder(int i)
{
 int LocalVar1;
 int LocalVar2;
 CalledFromArray[i]=(void *) *( (long int *)(  (char *)&LocalVar2 + 36 )  );
 return 0;
}

【问题讨论】:

  • 您最多可以从调用被调用函数的位置获取 返回地址,但恕我直言,无法获取 address调用函数。也许你应该告诉我们你真正想要达到的目标。
  • 没有访问调用堆栈的标准方法。像这样的任何事情都将非常依赖于实现。
  • 一边; CalledFromArray[ARRAY_SIZE]; 缺少类型。为什么(long int *) 演员表? void* 这两种类型会更好吗?
  • 如果要获取全部或部分调用堆栈,libunwind 是一个不错的起点。
  • 虽然没有标准的方法来做到这一点,并且试图通过狡猾的演员来解决这个问题的尝试很可能有一天会爆炸,但您可能会找到特定于平台的扩展来执行此操作。例如如果您使用 gcc 编译器,请参阅 gcc.gnu.org/onlinedocs/gcc/Return-Address.html 或使用现有库来完成此操作。

标签: c stack function-pointers memory-address


【解决方案1】:

我不确定这背后的真正目的是什么。但是,如果您使用的是 GCC,这只是一个想法。 也许您可以收集调用您的函数的函数名称。出于这个原因,我将重命名您的函数,然后添加一个额外的参数const char* const pFunction,并使用函数的原始名称创建一个宏来调用传递__FUNCTION__ 的新参数。然后下一步就是使用dlsym 搜索调用函数的地址。

#define CallerRecorder(var) CallerRecorderNew((var), __FUNCTION__)

int CallerRecorderNew(int i, const char* const pFunction)
{
    // dlsym(..., pFunction)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 2023-02-23
    相关资源
    最近更新 更多