C++ C++;从调用指定函数/方法的位置进行检查

C++ C++;从调用指定函数/方法的位置进行检查,c++,C++,是否可以从调用指定函数的位置进行检查?e、 g.获取负责调用它的地址,或者如果我想检查此函数是从“File.exe”还是“Other.dll”调用的?提前谢谢 编辑:我想在我的代码中执行此操作(无需任何调试器)。如果可以设置断点,则可以检查调用堆栈。如果可以设置断点,则可以检查调用堆栈。我的第一个问题必须是:为什么要这样做 话虽如此,但绝对没有便携式方法可以做到这一点。就我所知,有了GCC和Clang,您可以使用内置的返回地址(0),但有了Visual Studio(我假设您使用的是给定的exe

是否可以从调用指定函数的位置进行检查?e、 g.获取负责调用它的地址,或者如果我想检查此函数是从“File.exe”还是“Other.dll”调用的?提前谢谢


编辑:我想在我的代码中执行此操作(无需任何调试器)。

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

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

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

话虽如此,但绝对没有便携式方法可以做到这一点。就我所知,有了GCC和Clang,您可以使用内置的返回地址(0),但有了Visual Studio(我假设您使用的是给定的exe/dll),我无法提供任何等效的地址


通常情况下,如果您正在这样做,您需要查看您的设计,因为除非您正在编写(比如)蹦床函数,否则没有理由获取呼叫地址。

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

话虽如此,但绝对没有便携式方法可以做到这一点。就我所知,有了GCC和Clang,您可以使用内置的返回地址(0),但有了Visual Studio(我假设您使用的是给定的exe/dll),我无法提供任何等效的地址


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

正如chmeee所说,没有可移植的方法来实现这一点。在Windows上,有一组调试函数(您可以在代码中使用)来完成它(某种程度上):

正如chmeee所说,没有可移植的方法来完成这项工作。在Windows上,有一组调试函数(您可以在代码中使用)来完成它(某种程度上):

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


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

我通常抛出一个伪异常。它在Java中工作。(和C++在我过去的几年里)。 像


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

如果您在Windows上,您可能可以使用dbghelp库中提供的函数。我想你可以用这个

你可以找到一个。它说:

这个类的用法非常简单。例如,如果你想 显示当前线程的调用堆栈,只需实例化 StackWalk对象并调用ShowCallstack成员:

#包括
#包括“StackWalker.h”
void Func5(){StackWalker sw;sw.ShowCallstack();}
void Func4(){Func5();}
void Func3(){Func4();}
void Func2(){Func3();}
void Func1(){Func2();}
int main()
{
Func1();
返回0;
}

如果您在Windows上,您可能可以使用dbghelp库中提供的函数。我想你可以用这个

你可以找到一个。它说:

这个类的用法非常简单。例如,如果你想 显示当前线程的调用堆栈,只需实例化 StackWalk对象并调用ShowCallstack成员:

#包括
#包括“StackWalker.h”
void Func5(){StackWalker sw;sw.ShowCallstack();}
void Func4(){Func5();}
void Func3(){Func4();}
void Func2(){Func3();}
void Func1(){Func2();}
int main()
{
Func1();
返回0;
}

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


否则,就没有可移植的方法来实现这一点。即使是不可移植的方式也不一定能完全按照您的预期工作。内省不是C++的事情。

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

否则,就没有可移植的方法来实现这一点。即使是不可移植的方式也不一定能完全按照您的预期工作。内省不是C++的事情

try {
    throw(new Exception());
}
catch(Exception e) {
    e.printStackTrace();
}
#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;
}