如何在c ++中记录函数的堆栈返回地址

时间:2012-06-25 03:57:15

标签: c++ c logging assembly hook

我想知道如何记录函数的堆栈返回地址?

如果你记录这样的参数:

int (WINAPI *pSend)(SOCKET s, const char* buf, int len, int flags) = send;
int WINAPI MySend(SOCKET s, const char* buf, int len, int flags);

//在DllMain下面

int WINAPI MySend(SOCKET s, const char* buf, int len, int flags)
{
    fopen_s(&pSendLogFile, "C:\\SendLog.txt", "a+");
    fprintf(pSendLogFile, "%s\n", buf);
    fclose(pSendLogFile);
    return pSend(s, buf, len, flags);
}

然后我如何记录Send的返回地址?

2 个答案:

答案 0 :(得分:3)

我不确定你想要达到的目标,所以很难知道这是否是正确的答案。我会假设你知道你在做什么,但我会敦促你重新考虑你的设计。

如上所述,请查看http://msdn.microsoft.com/en-us/library/64ez38eh处的内在函数_ReturnAddress(),它将为您提供从您返回的函数_ReturnAddress()后立即执行的指令的地址,以及_AddressOfReturnAddress()位于http://msdn.microsoft.com/en-us/library/s975zw7,它会为您提供存储寄件地址的地址。

务必仔细阅读文档 了解您要回复的地址代表什么。如果你操纵了返回地址,那就非常小心,因为如果你做错了事情,事情就会(并且会)兴旺发达。

答案 1 :(得分:1)

您无法以独立于平台/编译器的方式执行此操作。在Windows中,您可以使用StackWalk / StackWalk64函数。几年前我用过它们。如果您有堆栈模块的调试信息,则可以获取函数的名称。

例如,请查看:http://msdn.microsoft.com/en-us/library/windows/desktop/ms680650(v=vs.85).aspx