从被调用函数获取局部变量到被调用函数

时间:2015-11-10 20:39:20

标签: c linux unix

所以,我有一项需要帮助的作业。 我得到了一个名为foo()的函数和一个名为recover()的函数的代码。我无法改变foo的代码,并且recover不能有任何参数,也不会返回任何参数。

这样做的目的是让恢复从foo中获取局部变量并打印出来。

示例:

long foo(long a, long b, long c, long d, long e){
   long x, y, z;
   if(e < 0)
   {
      recover();
      return a;
   }
   //do various things with a, b, and c, and store in x, y, and z respectively
   return foo(x,y,z,d+1,e-1)+a+b+c+d+e;
}

void recover(void)
{
   //What goes here to get the values?
}

recover()应该做的是从foo()的EACH调用中获取a,b和c值并将其打印出来。我也知道全局变量不允许出现这个问题。

感谢您对此问题的任何帮助。

2 个答案:

答案 0 :(得分:2)

警告:以下代码高度依赖于编译器/体系结构且不兼容。使用它需要您自担风险。

局部变量存储在堆栈中,因此您可以通过自己声明局部变量并移动来获取父函数的局部变量。

首先为您的变量添加一些易于识别的值(稍后您将删除它们)

long foo(long a, long b, long c, long d, long e){
   long x=11111, y=22222, z=33333;
   ...

可能你正在使用PC,因此你的堆栈会逐渐减少,你的目标也会在堆栈中上升。只要环顾四周,直到找到它们:

void recover(void)
{
    long p;
    long *q = &p;
    for (int i=0; i < 20; ++i)
    {
        printf("%d -> %ld\n", i, q[i]);
    }
}

或者你可以使用调试器!

答案 1 :(得分:0)

听起来像堆栈黑客练习。

尝试定义一个局部变量,获取地址,然后修改该地址以进入堆栈(添加或减去,具体取决于您的机器),直到您最终指向调用函数中的变量。

这是非常依赖系统的,所以你需要做一些游戏才能搞清楚。我建议用一组已知的参数调用<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> <TableRow android:layout_width="fill_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/TextView1" android:layout_width="match_parent" android:layout_height="wrap_content"/> <ImageView android:layout_width="33dp" android:layout_height="match_parent" android:layout_weight="1" android:layout_marginRight="15dp" android:src="@drawable/nextarrow" /> </TableRow> </LinearLayout> ,并专门查看这些值,以确保您找到正确的位置。一旦你搞清楚了,你就可以获得foo的任何调用值。