当前功能地址 - x64

时间:2010-08-19 21:55:23

标签: c++ visual-c++

我正在开发这个小项目,我想生成一个应用程序的调用图 - 我不打算做任何复杂的事情,它主要是为了娱乐/体验。我正在x64平台上工作。

我自己设定的第一个目标是能够衡量我的测试应用程序的每个功能所花费的时间。到目前为止,我的策略是使用__penter()_和__pexit()_ - __penter()_是一个函数,它将在每个方法或函数的开头被调用,相反__pexit()_将在最后被调用每种方法或功能。

通过这两个函数,我可以记录每个函数调用以及每个函数调用所花费的时间。我接下来要做的是获取每个函数的地址 例如,如果我们考虑以下callstack(非常简化):


main()  
....myFunction()  
........_penter()
 

我在__penter_中,我想得到调用函数的地址, myFunction()。我已经找到了在非叶函数的情况下执行此操作的方法,我只使用RtlLookupFunctionEntry。但是,此解决方案似乎不适用于叶函数,因为它们不提供任何展开数据。

我正在考虑的一件事是在callstack中再增加一个级别,在 main()中,并手动解码CALL过程 - 这将涉及获取指向调用<的指令的指针EM> myFunction的()

我想知道你是否有人知道如何在叶子函数的情况下获取当前函数的地址。我有这种直觉,认为我目前的做法有点过于复杂。

谢谢,

克莱姆

2 个答案:

答案 0 :(得分:1)

我相信SymGetSymFromAddr64,可能与StackWalk64一起应该让你(大部分?)得到你想要的东西。

答案 1 :(得分:1)

嗯,x64代码,除非你使用ml64.exe,否则没有装配黑客。这里有一个应该有帮助的内在函数,_ReturnAddress()为你提供了对__penter()函数调用的代码位置。 btw之后的指令。这应该足以帮助您识别来电者。