C ++检查从哪里调用指定的函数/方法

时间:2013-08-16 17:02:48

标签: c++

是否有可能以某种方式检查指定函数的调用位置?例如获取负责调用它的地址,或者如果我想检查是否从“File.exe”或“Other.dll”调用此函数?提前谢谢。

编辑:我想在我的代码中完成它(没有任何调试器..)

6 个答案:

答案 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)。