Я немного запутался в следах нашей программы и буду очень рад любым подсказкам или предположениям о том, что может произойти. Мне кажется, что конструктор std::vector<details::AVP_key>
в строке 59
выполнен неправильно (частично) и сразу же называется деструктором, который не работает. Я понятия не имею, почему в кадре обратной трассировки #9
я вижу деструктор вектора при обработке векторного конструктора.
Код
53 static Validation_result check_internal(const Command_entry &cmd, const
message::diameter::delegate_type &msg, const message::diameter::avp_list_t &msg_avps)
54 {
55 auto tmp = check_fixed_avps(cmd.get_fixed_avps(), msg_avps.begin(), msg_avps.end());
56 auto &optional_avps = cmd.get_optional_avps();
57 if(tmp.check_result)
58 {
59 std::vector<details::AVP_key> avp_keys(msg_avps.end() - tmp.pos); // substraction of iterators
60 ...
, где AVP_key равно
using id_type = uint32_t;
namespace details
{
struct AVP_key
{
id_type code;
id_type vendor;
bool operator==(const AVP_key &) const;
bool operator<(const AVP_key &) const;
};
Backtrace
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Core was generated by `...some command...'.
Program terminated with signal SIGABRT, Aborted.
#0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
51 ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
[Current thread is 1 (Thread 0x7fb4fb84b700 (LWP 31575))]
(gdb) bt
#0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
#1 0x00007fb50046842a in __GI_abort () at abort.c:89
#2 0x00007fb5004a4c00 in __libc_message (do_abort=do_abort@entry=2, fmt=fmt@entry=0x7fb500599fd0 "*** Error in `%s': %s: 0x%s ***\n") at ../sysdeps/posix/libc_fatal.c:175
#3 0x00007fb5004aafc6 in malloc_printerr (action=3, str=0x7fb50059a048 "double free or corruption (!prev)", ptr=<optimized out>, ar_ptr=<optimized out>) at malloc.c:5049
#4 0x00007fb5004ab80e in _int_free (av=0x7fb488000020, p=0x7fb3935fcef0, have_lock=0) at malloc.c:3905
#5 0x000055b837aef403 in __gnu_cxx::new_allocator<diameter::details::AVP_key>::deallocate (this=<synthetic pointer>, __p=0x7fb3935fcf00) at /usr/include/c++/6/ext/new_allocator.h:110
#6 std::allocator_traits<std::allocator<diameter::details::AVP_key> >::deallocate (__a=<synthetic pointer>..., __n=<optimized out>, __p=0x7fb3935fcf00) at /usr/include/c++/6/bits/alloc_traits.h:462
#7 std::_Vector_base<diameter::details::AVP_key, std::allocator<diameter::details::AVP_key> >::_M_deallocate (this=<synthetic pointer>, __n=<optimized out>, __p=0x7fb3935fcf00) at /usr/include/c++/6/bits/stl_vector.h:178
#8 std::_Vector_base<diameter::details::AVP_key, std::allocator<diameter::details::AVP_key> >::~_Vector_base (this=<synthetic pointer>, __in_chrg=<optimized out>) at /usr/include/c++/6/bits/stl_vector.h:160
#9 std::vector<diameter::details::AVP_key, std::allocator<diameter::details::AVP_key> >::~vector (this=<synthetic pointer>, __in_chrg=<optimized out>) at /usr/include/c++/6/bits/stl_vector.h:427
#10 diameter::check_internal (msg=std::unique_ptr<message::diameter::DiameterMessageWrapper> containing 0x12d, msg_avps=..., cmd=...) at /some_path/check.cpp:59
#11 diameter::check (dictionary=..., msg=std::unique_ptr<message::diameter::DiameterMessageWrapper> containing 0x7fb4a2a56e10, msg_avps=std::vector of length 18, capacity 32 = {...})
at /some_path/check.cpp:116
Большое спасибо за помощь.
С уважением, Иржи