¿Cómo puedo encontrar la dirección (la dirección de retorno es suficiente) de la persona que llama de una función?

No estoy familiarizado con la arquitectura MIPS, pero si está usando gcc, hay un gcc incorporado para este propósito:

void * __builtin_return_address (unsigned int level); 

La documentación integrada de gcc (http://gcc.gnu.org/onlinedocs/gc…) dice lo siguiente:

Esta función devuelve la dirección de retorno de la función actual o de uno de sus llamantes. El argumento de nivel es el número de tramas para escanear la pila de llamadas. Un valor de 0 produce la dirección de retorno de la función actual, un valor de 1 produce la dirección de retorno del llamador de la función actual, y así sucesivamente

Entonces, puedes hacer algo como esto:

 #include  void foo() { printf("%p\n", __builtin_return_address(1)); } int main (int argc, const char* argv[]) { foo(); } 

No conozco ninguna forma estándar de hacer esto en C, pero es trivial en el ensamblaje.
Nunca he hecho ninguna programación de ensamblaje en MIPS, pero según tengo entendido algo así como lw $r1 0($sp) debería cargar la dirección de retorno en el registro 1.

Si necesita esto en C, puede leer sobre cómo su compilador implementa el ensamblaje en línea y hacer algo como

 int myfunction() { int *foo; __asm__ { lw $r1 0($sp) sw $r1 foo } printf("%p",foo); } 

dependiendo de cómo funcionan el ensamblaje en línea y los punteros en su compilador.
Para obtener la dirección de las funciones de llamada, se requiere que disminuya la dirección hasta que encuentre una coincidencia en la tabla de símbolos.

PD Si agrega su impresión de depuración a la parte superior de la función, debería poder usar el registro $ ra, que contiene la dirección de retorno más reciente, pero esto podría ser de una función que ya ha regresado.

puede usar backtrace () http://www.gnu.org/software/libc