是否有可能以某种方式检查调用指定函数的位置?例如获取负责调用它的地址,或者我想检查这个函数是从“File.exe”还是“Other.dll”调用的?提前致谢。
编辑:我想在我的代码中做到这一点(没有任何调试器..)
是否有可能以某种方式检查调用指定函数的位置?例如获取负责调用它的地址,或者我想检查这个函数是从“File.exe”还是“Other.dll”调用的?提前致谢。
编辑:我想在我的代码中做到这一点(没有任何调试器..)
如果可以设置断点,则可以检查调用堆栈。
我的第一个问题必须是:你为什么要这样做?
话虽如此,绝对没有可移植的方式来做到这一点。据我所知,使用 GCC 和 Clang,您可以使用 __builtin_return_address(0),但使用 Visual Studio(我假设您正在使用它,给定 exe/dll),我无法提供任何等效项。
通常,如果您这样做,您需要查看您的设计,因为除非您正在编写蹦床函数,否则没有理由获取调用地址。
正如 chmeee 所说,没有可移植的方法来做到这一点。在 Windows 上,有一组调试函数(您可以在代码中使用)来完成它(以某种方式):http: //msdn.microsoft.com/en-us/library/windows/desktop/ms679303( v=vs.85).aspx
如果是您的代码,请将调用者的姓名作为参数之一传递给函数。
否则,没有便携的方法可以做到这一点。即使是非便携式方式也不一定能完全按照您的预期工作。自省不是 C++ 的东西。
如果您在 Windows 上,您可能可以使用 dbghelp 库中提供的函数。我认为您可以使用StackWalkEx。
您可以在 CodeProject 上找到一个示例。它说:
该类的使用非常简单。例如,如果要显示当前线程的调用堆栈,只需实例化一个 StackWalk 对象并调用 ShowCallstack 成员:
#include <windows.h>
#include "StackWalker.h"
void Func5() { StackWalker sw; sw.ShowCallstack(); }
void Func4() { Func5(); }
void Func3() { Func4(); }
void Func2() { Func3(); }
void Func1() { Func2(); }
int main()
{
Func1();
return 0;
}
我通常会抛出一个假异常。它在Java中工作过。(以及我过去几年的 C++)。像
try {
throw(new Exception());
}
catch(Exception e) {
e.printStackTrace();
}
我知道的唯一其他编程方式是使用 Aspects (AOP)。