2012-08-06 23 views
6

Tengo un puntero disponible conmigo para una variable C/C++. ¿Es posible distinguir exactamente a qué segmento de la memoria pertenece esta variable? Si es así, ¿cómo?Identificación de si una dirección pertenece a heap o stack o registra

Nota: Sólo tengo la dirección de esta variable, no hay más información si la variable es local/global, etc.

+8

No es posible, al menos no de una manera portátil. – juanchopanza

+3

¿Qué problema estás tratando de resolver? ¿Necesita una solución en tiempo de ejecución o en tiempo de compilación? los registros no tienen direcciones. –

+0

Acabamos de tener un argumento sobre si la variable global pertenecería a stack o heap, queríamos confirmarlo nosotros mismos: P –

Respuesta

2

Averigüe si su arquitectura tiene punteros a su montón o pila región. Generalmente hay algunos stackpointers o framepointers ..

Luego compare su dirección real con esas direcciones y decida a qué lugar pertenecen.

+0

jeje, sí, tienes razón;) Pero si hablas de arquitecturas exóticas, también es posible poner variables globales en la pila o en el montón. Esto también depende de la arquitectura. – duedl0r

+0

¿Mencioné que el hardware de Univac tampoco tenía una pila? .-) –

+0

Solo creo en material que se inventó después de 1981 jejeje: D – duedl0r

1

Primero puede identificar cuáles son el principio y el final de las diferentes secciones en su ejecutable. Para ello, es necesario agregar, finalmente, algunas variables en el guión de enlazado alrededor de cada sección de esta manera:

SECTIONS { 
    [...] 
    .data : { 
     data_start = .; 
     *(.data) 
     data_end = .; 
    } 
    [...] 
} 

Luego, puede declarar estas variables como externa en su código C/C++ y utilizarlos directamente para comparar la dirección que quiero identificar

Puede que no sea fácil modificar la secuencia de comandos del enlazador. Con gcc, se puede volcar con:

gcc -Wl,-verbose whatever.c 

luego tratar de encontrar las variables ya definidas en la salida (desordenado).

Para obtener los límites de la pila, puede crear una instancia de una variable ficticia al comienzo de su función main() y guardar su dirección como la parte superior de la pila, luego crear otra en la posición actual, lo que hará darte el final Sin embargo, tenga en cuenta que el compilador puede no comportarse exactamente así (el orden de pila de las variables en C no está garantizado, ni siquiera el uso de la pila) por lo que debería funcionar, pero no ser portátil.

Finalmente, para el montón, no tengo truco. Debo inferir que una variable que no está en datos/bss/derivada y no en la pila estaría en el montón (sin incluir los registros, pero si puede obtener la dirección, apostaría que el compilador nunca usará un almacenamiento de registro solamente)

2

Si está utilizando Linux (no estoy seguro sobre otros sistemas Unix), que podría ser capaz de encontrar la información en el archivo de /proc/<pid>/maps

0

no sé exactamente si se ajusta a su situación, pero se puede tratar objdump -t para ver la tabla de símbolos de un archivo elf. Todo lo que necesitas es la dirección de tu variable. Allí puede encontrar indicadores que le muestran la sección de cada variable. Consulte la página de manual para objdump para más detalles. salida

muestra:

0804a020 g  O .bss 00000004    var 

Dice var es una bject g lobal O en dirección 0804a020, sección .bss

Cuestiones relacionadas