是否有可能以某种方式检查指定函数的调用位置?例如获取负责调用它的地址,或者如果我想检查是否从“File.exe”或“Other.dll”调用此函数?提前谢谢。
编辑:我想在我的代码中完成它(没有任何调试器..)
答案 0 :(得分:2)
如果可以设置断点,则可以检查调用堆栈。
答案 1 :(得分:2)
我的第一个问题必须是:你为什么要这样做?
话虽如此,绝对没有可行的方法来做到这一点。有了GCC和Clang,据我所知,你可以使用__builtin_return_address(0),但是使用Visual Studio(我认为你使用的是给定exe / dll),我不能提供任何等价物。
通常情况下,如果您这样做,您需要查看您的设计,因为除非您正在编写蹦床函数,否则没有理由获取调用地址。
答案 2 :(得分:1)
正如chmeee所说,没有便携式方法可以做到这一点。在Windows上,有一组调试函数(可以在代码中使用)来完成它(在某种程度上):http://msdn.microsoft.com/en-us/library/windows/desktop/ms679303(v=vs.85).aspx
答案 3 :(得分:1)
如果是你的代码,将调用者的名字作为函数的一个参数传递。
否则,没有可移植的方法来做到这一点。甚至非便携式方式也不一定能按预期完全正常工作。内省不是C ++的事情。
答案 4 :(得分:0)
如果您使用的是Windows,则可能使用dbghelp库中提供的功能。我想你可以使用StackWalkEx。
您可以找到example on CodeProject。它说:
该类的用法非常简单。例如,如果你想 显示当前线程的callstack,只是实例化a 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;
}
答案 5 :(得分:-2)
我通常会抛出假的例外。它在Java中有效。 (和我过去几年的C ++)。 喜欢
try {
throw(new Exception());
}
catch(Exception e) {
e.printStackTrace();
}
我所知道的唯一其他编程方式是使用Aspects(AOP)。