任意指令指针是否驻留在特定函数中?

LCC*_*LCC 2 c c++

我有一个非常难以解决的问题:假设我有一个任意指令指针.我需要找出该指令指针是否驻留在特定函数中(让我们称之为"Foo").

一种方法是尝试找到函数的开始和结束边界,并查看IP是否位于其中.起始界很容易找到:

    void *start = &Foo;

问题是,我不知道如何获取函数的结束地址(或函数的"长",以汇编的字节为单位).

有没有人有任何想法如何获得一个函数的"长度",或完全不同的方式这样做?

假设函数中没有SEH或C++异常处理.另请注意,我在win32平台上,并且可以完全访问win32 api.

Mic*_*ael 7

这不行.你假设函数在内存中是连续的,并且一个地址将映射到一个函数.优化器在这里有很多余地,可以从图像周围的函数移动代码.

如果你有PDB文件,你可以使用像dbghelp或DIA API这样的东西来解决这个问题.例如,SymFromAddr.这里可能存在一些歧义,因为单个地址可以映射到多个函数.

我见过的代码试图在之前尝试这样做:

#pragma optimize("", off)
void Foo()
{
}

void FooEnd()
{
}
#pragma optimize("", on)
Run Code Online (Sandbox Code Playgroud)

然后用FooEnd-Foo计算函数Foo的长度.这种方法非常容易出错,并且仍然会对代码的生成方式做出很多假设.