我想知道如何记录函数的堆栈返回地址?
如果你记录这样的参数:
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的返回地址?
答案 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