Оно работает. Спасибо, ты спасатель жизни @geza.
исал инструментальный инструмент на C ++ для регистрации функций входа и выхода, подключая вызовы входа и выхода. Он работает, как и предполагалось, с устаревшей кодовой базой. Однако при подключении к проекту, который я скачал из git, адреса функций, которые я сохраняю в переменной extern в коде темы, они отличаются в библиотеке профилировщика. Это путает сравнение указателя функции между подключенными и сохраненными функциями.
Адрес функции в основном файле кода объекта, точка останова находится внутри функции ловушки _penter в коде профилировщика
Эта же запись показывает другой адрес с «_» перед именем функции в коде профилировщика.
Я понятия не имею, как это меняет адреса, и хочу знать, если я делаю что-то не так.
То, как я это делаю, так это то, что у меня есть внешний массив указателей на функции (и их имена), который инициализируется ссылками на функции кода субъекта в основном файле субъекта (где доступны все функции). В функции ловушки (_penter) библиотеки я получаю адрес только что введенной функции. Поэтому я сравниваю его с адресами в массиве extern, и, если это совпадение, я записываю введенную функцию.
SNIPPET FROM PROFILE.H (профилировщик)
extern Signature FuncTable[3000];
SNIPPET FROM PROFILE.CPP (профилировщик)
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 (основной файл основного кода)
#include "../Profile/Profile.h"
Signature FuncTable[] = {
{ (int)TetrisView_ProcessPauseMenu, "TetrisView_ProcessPauseMenu" },
{ NULL }
};