【问题标题】:How to get the name, or file and line of caller method? [duplicate]如何获取调用者方法的名称或文件和行? [复制]
【发布时间】:2013-03-30 20:54:12
【问题描述】:

在 C++11(使用最新的 GCC)中有没有办法获取 调用当前执行方法的方法(调用者)的名称或文件和行号?

例如,当以下代码失败时,我想在错误消息中使用此信息:

void SomewhereInMyProgram()
{
    DoSomething(nullptr);
}

void DoSomething(const char* str)
{
    Contract::Requires(str != nullptr);
    // ...
}

目前我有代码报告DoSomething 中发生的错误。虽然这在技术上是正确的,但我希望它报告发生在SomewhereInMyProgram 中的错误,无论它在哪里。这会让我的生活轻松很多!

该解决方案可以使用任何 C++11 功能、宏或 GCC 特定的东西,而不是我必须在每个调用站点添加的东西。

我认为堆栈跟踪不会帮助我,因为我不能使用异常处理。实际上,我非常有限:它是一个独立的环境,标准 C++ 头文件不可用。我希望有某种宏观解决方案。


class Contract
{
public:
    static void RequiresImpl(bool condition, const char* expression,
        const char* file, int line);

    #define Requires(condition) RequiresImpl(condition, #condition , \
        __FILE__, __LINE__ )
};

【问题讨论】:

  • 听起来您正在寻找运行时堆栈跟踪,即看看这个 SO 问题(他们如何获得堆栈跟踪)stackoverflow.com/questions/77005/…
  • @epatel 我不是在寻找堆栈跟踪,因为我不能使用异常处理。顺便说一句,我肯定不会问与您标记为重复的问题相同的问题?
  • 我的意思是你应该查看handler() 函数,看看他们如何从那里获取堆栈跟踪,即函数backtrace()backtrace_symbols()backtrace_symbols_fd()。尝试在您想要获得“来电者”的同一个地方使用它们

标签: c++ debugging gcc methods c++11


【解决方案1】:

将 DoSomething 包装在一个宏中:

void DoSomethingImp(char const *, char const *file, char const *line)
{
    // do whatever needed, use file and line to report problems
}

#define DoSomething(x) DoSomethingImp(x, __FILE__, __LINE__)

免责声明:

这不是最好的做法,人们对以这种方式为 ANSI 或 UNICODE 定义的 WIN API 宏大喊大叫。但我相信如果您不想更改对 DoSomething 的每次调用,这是唯一的方法。

【讨论】:

    【解决方案2】:

    据我所知,自动获取有关先前调用的信息的唯一方法是使用回溯。这篇文章有大量关于这样做的信息:

    How to generate a stacktrace when my gcc C++ app crashes

    【讨论】:

    【解决方案3】:

    在 gcc 中,您可以使用以下宏之一:__PRETTY_FUNCTION____FUNCTION____func__

    【讨论】:

    • 这给出了当前函数的名称,而不是调用函数的名称或行号。
    猜你喜欢
    • 2011-10-27
    • 2017-04-19
    • 2016-03-20
    • 1970-01-01
    • 2022-12-10
    • 2011-03-06
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多