【问题标题】: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)。

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

【问题讨论】:

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

标签: c++ visual-studio logging c++17 visual-studio-2019


【解决方案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;
}

【讨论】:

    猜你喜欢
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-26
    相关资源
    最近更新 更多