C ++如何在重载" new"中获取行号和函数名。操作者

时间:2017-09-08 09:53:58

标签: c++

我想在多线程环境中重载new运算符,并希望在其中包含线程ID,函数名和行号。有没有办法做到这一点?

2 个答案:

答案 0 :(得分:2)

您可以制作新的operator new重载:

void * operator new(std::size_t count, const char* file, int line)
{
    // Do stuff
    // ...
    return ::operator new(count);
}

void * operator delete(void* p, const char* file, int line)
{
    // Do stuff
    // ...
    return ::operator delete(p);
}

// ... and [] versions ..

然后您可以使用放置语法:

auto x = new (__FILE__, __LINE__) Foo;

然后你可以添加一个宏:

#define TRACE_NEW new (__FILE__, __LINE__)

auto x = TRACE_NEW Foo;

答案 1 :(得分:0)

一般来说,没有办法做你想做的事情(除了当然使用像moldbnilo answered这样的宏,或者未来std::source_location

但是,如果您使用的是最近的Linux系统,并且所有代码(以及它使用的大多数库,包括libstdc++)都是使用调试选项编译的,那么您也可以考虑Ian Taylor&#39 ; s libbacktrace(它也在GCC中使用)并在operator new实施中使用它。使用libbacktrace operator new可以使用call stack调试信息检查DWARF中的调用帧。

您甚至可以在call stack中找到大多数功能的来源位置(尤其是-g来电者的来源位置)。

请记住,您可以使用调试信息(例如-O1)和一些优化标记(例如-O2或者可能编译一些C ++代码(使用GCCClang-fsanitize=address);当然,调试信息(在DWARF中)将是"模糊"但在实践中仍然可以使用。

顺便说一句,也许你只需要valgrind或者通过与{{1}} instrumentation option进行汇编来解决一些问题(我们不知道因为你的问题没有动机)。