Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c++;附加的探查器库中的函数地址与主题代码库中的函数地址不同 我编写了一个C++工具,通过登录和退出调用来记录登录和退出功能。它与遗留代码库的工作方式如出一辙。然而,当我挂接从git下载的项目时,我将函数地址保存在主题代码中的一个外部变量中,它们在探查器库中的表现是不同的。这就搞乱了连接函数和保存函数之间的函数指针比较_C++_Profiler_Trace_Instrumentation - Fatal编程技术网

c++;附加的探查器库中的函数地址与主题代码库中的函数地址不同 我编写了一个C++工具,通过登录和退出调用来记录登录和退出功能。它与遗留代码库的工作方式如出一辙。然而,当我挂接从git下载的项目时,我将函数地址保存在主题代码中的一个外部变量中,它们在探查器库中的表现是不同的。这就搞乱了连接函数和保存函数之间的函数指针比较

c++;附加的探查器库中的函数地址与主题代码库中的函数地址不同 我编写了一个C++工具,通过登录和退出调用来记录登录和退出功能。它与遗留代码库的工作方式如出一辙。然而,当我挂接从git下载的项目时,我将函数地址保存在主题代码中的一个外部变量中,它们在探查器库中的表现是不同的。这就搞乱了连接函数和保存函数之间的函数指针比较,c++,profiler,trace,instrumentation,C++,Profiler,Trace,Instrumentation,主题代码主文件中的函数地址,断点当前位于探查器代码中的_penterhook函数内 在探查器代码中,同一条目显示了一个不同的地址,该地址的函数名前面有一个“\” 我不知道它是如何改变地址的,我想知道我是否做错了什么 我这样做的方式是,我有一个函数指针(及其名称)的外部数组,它在subject主文件(其中所有函数都可用)中用subject代码函数的引用进行初始化。在库的hook函数(_penter)中,我得到了刚刚输入的函数的地址。因此,我将其与extern数组中的地址进行比较,如果匹配,则记

主题代码主文件中的函数地址,断点当前位于探查器代码中的_penterhook函数内

在探查器代码中,同一条目显示了一个不同的地址,该地址的函数名前面有一个“\”

我不知道它是如何改变地址的,我想知道我是否做错了什么

我这样做的方式是,我有一个函数指针(及其名称)的外部数组,它在subject主文件(其中所有函数都可用)中用subject代码函数的引用进行初始化。在库的hook函数(_penter)中,我得到了刚刚输入的函数的地址。因此,我将其与extern数组中的地址进行比较,如果匹配,则记录输入的函数

PROFILE.H(profiler)中的片段

PROFILE.CPP(profiler)中的片段

main.c(主题代码主文件)中的代码片段


我认为这是因为增量链接。当它打开时,您将得到一个增量链接表(ILT)。ILT包含一个跳转表。调用函数时,将通过此ILT调用该函数

FuncTable
中,您将得到一个位于ILT中的地址,它不是实际函数的地址。但是在
\u penter
中,它的返回地址将是实际的函数(这是放入
pCaller
中的内容)

关闭增量链接,您就会没事了

extern Signature FuncTable[3000]; 
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
    }
}
#include "../Profile/Profile.h"
Signature FuncTable[] = {
    { (int)TetrisView_ProcessPauseMenu, "TetrisView_ProcessPauseMenu" },
    { NULL }
};