为什么我的全局new()重写被绕开了?

时间:2018-10-08 23:21:30

标签: c++ boost new-operator allocator

我有一个动态库(libdatamodel.so)文件,该文件与我的新/删除替代静态链接。有一些分配没有被我的优先选择占用,我不确定为什么。

我使用调试器从应该使用我的重写的调用之一中获取堆栈跟踪,但不是。

Stacktrace:

thread #124, name = 'run-vizqlserver', stop reason = breakpoint 7.1
  frame #0: 0x00007fa70f1e9800 libc.so.6`__GI___libc_malloc
  frame #1: 0x00007fa70fad6e88 libstdc++.so.6`operator new(sz=952) at new_op.cc:50
  frame #2: 0x00007fa5c5701fed libdatamodel.so`void std::vector<FieldName, std::allocator<FieldName> >::_M_assign_aux<boost::multi_index::detail::bidir_node_iterator<boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::null_augment_policy, boost::multi_index::detail::index_node_base<FieldName, std::allocator<FieldName> > > > >(boost::multi_index::detail::bidir_node_iterator<boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::null_augment_policy, boost::multi_index::detail::index_node_base<FieldName, std::allocator<FieldName> > > >, boost::multi_index::detail::bidir_node_iterator<boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::null_augment_policy, boost::multi_index::detail::index_node_base<FieldName, std::allocator<FieldName> > > >, std::forward_iterator_tag) [inlined] __gnu_cxx::new_allocator<FieldName>::allocate(unsigned long, void const*) at new_allocator.h:104
  frame #3: 0x00007fa5c5701fcb libdatamodel.so`void std::vector<FieldName, std::allocator<FieldName> >::_M_assign_aux<boost::multi_index::detail::bidir_node_iterator<boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::null_augment_policy, boost::multi_index::detail::index_node_base<FieldName, std::allocator<FieldName> > > > >(boost::multi_index::detail::bidir_node_iterator<boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::null_augment_policy, boost::multi_index::detail::index_node_base<FieldName, std::allocator<FieldName> > > >, boost::multi_index::detail::bidir_node_iterator<boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::null_augment_policy, boost::multi_index::detail::index_node_base<FieldName, std::allocator<FieldName> > > >, std::forward_iterator_tag) [inlined] std::allocator_traits<std::allocator<FieldName> >::allocate(std::allocator<FieldName>&, unsigned long) at alloc_traits.h:360
  frame #4: 0x00007fa5c5701fcb libdatamodel.so`void std::vector<FieldName, std::allocator<FieldName> >::_M_assign_aux<boost::multi_index::detail::bidir_node_iterator<boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::null_augment_policy, boost::multi_index::detail::index_node_base<FieldName, std::allocator<FieldName> > > > >(boost::multi_index::detail::bidir_node_iterator<boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::null_augment_policy, boost::multi_index::detail::index_node_base<FieldName, std::allocator<FieldName> > > >, boost::multi_index::detail::bidir_node_iterator<boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::null_augment_policy, boost::multi_index::detail::index_node_base<FieldName, std::allocator<FieldName> > > >, std::forward_iterator_tag) [inlined] std::_Vector_base<FieldName, std::allocator<FieldName> >::_M_allocate(unsigned long) at stl_vector.h:170
  frame #5: 0x00007fa5c5701fcb libdatamodel.so`void std::vector<FieldName, std::allocator<FieldName> >::_M_assign_aux<boost::multi_index::detail::bidir_node_iterator<boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::null_augment_policy, boost::multi_index::detail::index_node_base<FieldName, std::allocator<FieldName> > > > >(boost::multi_index::detail::bidir_node_iterator<boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::null_augment_policy, boost::multi_index::detail::index_node_base<FieldName, std::allocator<FieldName> > > >, boost::multi_index::detail::bidir_node_iterator<boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::null_augment_policy, boost::multi_index::detail::index_node_base<FieldName, std::allocator<FieldName> > > >, std::forward_iterator_tag) [inlined] FieldName* std::vector<FieldName, std::allocator<FieldName> >::_M_allocate_and_copy<boost::multi_index::detail::bidir_node_iterator<boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::null_augment_policy, boost::multi_index::detail::index_node_base<FieldName, std::allocator<FieldName> > > > >(unsigned long, boost::multi_index::detail::bidir_node_iterator<boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::null_augment_policy, boost::multi_index::detail::index_node_base<FieldName, std::allocator<FieldName> > > >, boost::multi_index::detail::bidir_node_iterator<boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::null_augment_policy, boost::multi_index::detail::index_node_base<FieldName, std::allocator<FieldName> > > >) at stl_vector.h:1224
  frame #6: 0x00007fa5c5701fcb libdatamodel.so`void std::vector<FieldName, std::allocator<FieldName> >::_M_assign_aux<boost::multi_index::detail::bidir_node_iterator<boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::null_augment_policy, boost::multi_index::detail::index_node_base<FieldName, std::allocator<FieldName> > > > >(this=0x00007fa4cc9bdd30, __first=bidir_node_iterator<boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::null_augment_policy, boost::multi_index::detail::index_node_base<FieldName, std::allocator<FieldName> > > > @ rbx, __last=bidir_node_iterator<boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::null_augment_policy, boost::multi_index::detail::index_node_base<FieldName, std::allocator<FieldName> > > > @ r15, (null)=<unavailable>) at vector.tcc:273
  frame #7: 0x00007fa5c56ff372 libdatamodel.so`AbstractQuery::GetOutputFields() const [inlined] void std::vector<FieldName, std::allocator<FieldName> >::_M_assign_dispatch<boost::multi_index::detail::bidir_node_iterator<boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::null_augment_policy, boost::multi_index::detail::index_node_base<FieldName, std::allocator<FieldName> > > > >(this=<unavailable>, __first=<unavailable>, __last=<unavailable>) at stl_vector.h:1336
  frame #8: 0x00007fa5c56ff36a libdatamodel.so`AbstractQuery::GetOutputFields() const [inlined] void std::vector<FieldName, std::allocator<FieldName> >::assign<boost::multi_index::detail::bidir_node_iterator<boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::null_augment_policy, boost::multi_index::detail::index_node_base<FieldName, std::allocator<FieldName> > > >, void>(__first=<unavailable>, __last=<unavailable>) at stl_vector.h:508
  frame #9: 0x00007fa5c56ff36a libdatamodel.so`AbstractQuery::GetOutputFields() const [inlined] AbstractQuery::GetOutputVector(this=<unavailable>, c=<unavailable>) const at AbstractQuery.cpp:210

这是std :: vector的问题而不调用我的new()还是与boost内联到分配器的调用有关?我无法制作boost模板类型的正面或反面。

为完整起见,这是我确认我的新书/删除书确实在我的图书馆中定义的方式

$ nm -C libdatamodel.so | egrep "operator (new|delete)"
000000000017f1c0 T operator delete[](void*)
000000000017f1d0 T operator delete[](void*, std::nothrow_t const&)
000000000017f1a0 T operator delete(void*)
000000000017f1b0 T operator delete(void*, std::nothrow_t const&)
000000000017f150 T operator new[](unsigned long)
000000000017f190 T operator new[](unsigned long, std::nothrow_t const&)
000000000017f100 T operator new(unsigned long)
000000000017f140 T operator new(unsigned long, std::nothrow_t const&)

1 个答案:

答案 0 :(得分:1)

经过大量的实验和研究,我发现了针对此问题的两个或三个好的解决方案。我最初的问题是,在Windows上无法工作的内存覆盖在Linux上无法工作。 Windows将在运行库加载器甚至在图片中之前解析库中可以解析的所有符号。在Linux上,除非使用-Bsymobolic链接程序标志之一,否则情况并非如此。

由于担心意外的副作用,我选择不更改默认链接。因此,我将内存覆盖移到了它们自己的库中,并将它们直接链接到可执行文件。由于我的原始库是使用dlopen打开的,因此运行时加载程序会将其放在列表的末尾以进行符号解析。将我的内存替代直接链接到exe会使它们在列表中处于较高位置,并且一切正常。我也可以使用LD_PRELOAD来实现此目标,但选择在构建时全部完成。