Las direcciones de funciones de c ++ que salen diferentes en la biblioteca de perfiles adjunta que en la base del código de asunto
He escrito un instrumento-er en C ++ para registrar las funciones de entrada y salida conectando las llamadas de entrada y salida. Funciona como se supone que debe hacerlo con una base de código heredada. Sin embargo, al conectarme con un proyecto que descargué de git, las direcciones de función que guardo en una variable externa en el código de asunto, salen diferentes en la biblioteca de perfiles. Eso está arruinando la comparación del puntero de función entre las funciones enganchadas y guardadas.
Dirección de la función en el archivo principal del código de asunto, el punto de interrupción está dentro de la función de enlace _penter en el código del perfilador actualmente
La misma entrada muestra una dirección diferente con un "_" antes del nombre de la función, en el código del generador de perfiles
No tengo idea de cómo está cambiando las direcciones y quiero saber si estoy haciendo algo mal.
La forma en que lo hago es que tengo una matriz externa de punteros de función (y sus nombres) que se inicializa con referencias de funciones de código de asunto en el archivo principal de asunto (donde todas las funciones están disponibles). En la función de enlace (_penter) de la biblioteca, obtengo la dirección de la función que acabo de ingresar. Entonces lo comparo con las direcciones en la matriz externa, y si coincide, registro la función ingresada.
SNIPPET FROM PROFILE.H (generador de perfiles)
extern Signature FuncTable[3000];
SNIPPET FROM PROFILE.CPP (generador de perfiles)
void _stdcall EnterFunc0(unsigned * pStack)
{
void * pCaller;
pCaller = (void *)(pStack[0] - 5); // the instruction for calling _penter is 5 bytes long
Signature * funct = FuncTable; //the table that has references to functions and their names
funct = FuncTable;
while (funct->function)
{
//const BYTE * func = (const BYTE *)funct->function;
if ((void *)(pStack[0] - 5) == (void *)(funct->function))
{
int a = 0;
linesBuffer = linesBuffer + "Entering " + funct->signature + ";";
linesBuffer = linesBuffer + "\n";
WriteToFile(false); //function buffers 100kb before writing
break;
}
funct++;
}
}
extern "C" __declspec(naked) void __cdecl _penter()
{
_asm
{
pushad // save all general purpose registers
mov eax, esp // current stack pointer
add eax, 32 // stack pointer before pushad
push eax // push pointer to return address as parameter to EnterFunc0
call EnterFunc0
popad // restore general purpose registers
ret // start executing original function
}
}
SNIPPET FROM main.c (archivo principal del código de asunto)
#include "../Profile/Profile.h"
Signature FuncTable[] = {
{ (int)TetrisView_ProcessPauseMenu, "TetrisView_ProcessPauseMenu" },
{ NULL }
};