如何获取呼叫行号和文件名

Posted

技术标签:

【中文标题】如何获取呼叫行号和文件名【英文标题】:How to get calling line number and file name 【发布时间】:2020-03-07 09:26:16 【问题描述】:

我正在尝试记录内存分配。我希望能够准确指定在运行时调用特定函数的函数调用(行号和文件名)。比如:

// overloading operator new
void* operator new [](std::size_t const count) 
  void* p = std::malloc(count);
  if (!p) throw std::bad_alloc;
  std::cout << "Allocated " << count << " bytes in file '"
            << CALLING_FUNCTION_FILE_NAME << "'. Line "
            << CALLING_FUNCTION_LINE_NUMBER << '.\n';
  return p;

所以以后当我这样称呼它时:

// File sourceFileFoo.cpp

void foo()                // line 41
    int* ip = new int[10]; // line 42
    delete[] ip;           // line 43
                          // line 44

输出应该是这样的:

Allocated 40 bytes in file 'sourceFileFoo.cpp'. Line 42.

CALLING_FUNCTION_FILE_NAME 扩展为调用 operator new 的文件的名称 (sourceFileFoo.cpp),CALLING_FUNCTION_LINE_NUMBER 扩展为调用 operator new 的行 (42)。

    我知道如果可能的话,这将是特定于实现的。我正在使用 Visual Studio 和 C++17。 我不能定义一个宏NEW,它先进行日志记录,然后再进行分配。

【问题讨论】:

您使用的是哪个 C++ 版本? boost.stacktrace 可能值得一看。尽管据我回忆,所提供信息的“质量”可能高度依赖于平台/编译标志等。 @NutCracker C++17。编辑标签 【参考方案1】:

根据评论boost.stacktrace 可能是您正在寻找的。所以,简单地说,你的代码看起来像......

#include <boost/stacktrace.hpp>

/*
 * overloading operator new
 */
void *operator new [](std::size_t const count)

  void *p = std::malloc(count);
  if (!p)
    throw std::bad_alloc;
  std::cout << "Allocated " << count << " bytes at "
            << boost::stacktrace::stacktrace() << '.\n';
  return p;

【讨论】:

以上是关于如何获取呼叫行号和文件名的主要内容,如果未能解决你的问题,请参考以下文章

调用render()时如何获取Django模板错误的文件名和行号?

如何使用python获取丢失的记录行号和列名?

如何获取使用 Perl 打开的文件的当前行号

在针对 XML 模式验证 XML 文件时如何获取错误的行号

微信小程序如何获取当前行号

C# - 调用异常时如何获取类名和行号