【发布时间】: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