如何获取呼叫行号和文件名
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;
【讨论】:
以上是关于如何获取呼叫行号和文件名的主要内容,如果未能解决你的问题,请参考以下文章