我有一个动态库(libdatamodel.so)文件,该文件与我的新/删除覆盖静态链接。有一些分配没有被我的优先选择占用,我不确定为什么。
我使用调试器从应该使用我的重写的调用之一中获取堆栈跟踪,但不是。
堆栈跟踪:
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&)
最佳答案
经过大量的实验和研究,我发现了两个或三个解决此问题的好方法。我最初的问题是,在Windows上运行的内存覆盖在Linux上不起作用。 Windows将在运行库加载器甚至在图片中之前解析库中可以解析的所有符号。在Linux上,除非使用-Bsymobolic链接程序标志之一,否则情况并非如此。
为了避免意外的副作用,我选择不更改默认链接。因此,我将内存覆盖移到了自己的库中,并将它们直接链接到可执行文件。由于我的原始库是使用dlopen打开的,因此运行时加载程序会将其放在列表的末尾以进行符号解析。将我的内存替代直接链接到exe会使它们在列表中处于较高位置,并且一切正常。我也可以使用LD_PRELOAD来实现此目标,但选择在构建时全部完成。
关于c++ - 为什么我的全局new()重写被绕过了?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52711298/