0

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

编辑:我想在我的代码中做到这一点(没有任何调试器..)

4

6 回答 6

2

如果可以设置断点,则可以检查调用堆栈。

于 2013-08-16T17:07:13.153 回答
2

我的第一个问题必须是:你为什么要这样做?

话虽如此,绝对没有可移植的方式来做到这一点。据我所知,使用 GCC 和 Clang,您可以使用 __builtin_return_address(0),但使用 Visual Studio(我假设您正在使用它,给定 exe/dll),我无法提供任何等效项。

通常,如果您这样做,您需要查看您的设计,因为除非您正在编写蹦床函数,否则没有理由获取调用地址。

于 2013-08-16T17:11:52.953 回答
1

正如 chmeee 所说,没有可移植的方法来做到这一点。在 Windows 上,有一组调试函数(您可以在代码中使用)来完成它(以某种方式):http: //msdn.microsoft.com/en-us/library/windows/desktop/ms679303( v=vs.85).aspx

于 2013-08-16T17:15:09.000 回答
1

如果是您的代码,请将调用者的姓名作为参数之一传递给函数。

否则,没有便携的方法可以做到这一点。即使是非便携式方式也不一定能完全按照您的预期工作。自省不是 C++ 的东西。

于 2013-08-16T17:42:40.457 回答
0

如果您在 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;
}
于 2013-08-16T17:26:35.863 回答
-2

我通常会抛出一个假异常。它在Java中工作过。(以及我过去几年的 C++)。像

try {
    throw(new Exception());
}
catch(Exception e) {
    e.printStackTrace();
}

我知道的唯一其他编程方式是使用 Aspects (AOP)。

于 2013-08-16T17:18:07.497 回答