Я новичок в gdb, так что, возможно, вопрос не ценный, но он меня очень смутил. Я обнаружил, что мой код иногда дает сбой, файл дампа ядра показывает, что сигналом сбоя является SIGABRT, а обратная трассировка –
#0 __pthread_kill_implementation (no_tid=0, signo=6, threadid=140188693307392) at ./nptl/pthread_kill.c:44
#1 __pthread_kill_internal (signo=6, threadid=140188693307392) at ./nptl/pthread_kill.c:78
#2 __GI___pthread_kill (threadid=140188693307392, signo=signo@entry=6) at ./nptl/pthread_kill.c:89
#3 0x00007f8039485476 in __GI_raise (sig=sig@entry=6) at ../sysdeps/posix/raise.c:26
#4 0x00007f803946b7f3 in __GI_abort () at ./stdlib/abort.c:79
#5 0x00007f80394cc676 in __libc_message (action=action@entry=do_abort, fmt=fmt@entry=0x7f803961eb77 "%s\n") at ../sysdeps/posix/libc_fatal.c:155
#6 0x00007f80394e3cfc in malloc_printerr (str=str@entry=0x7f8039621210 "munmap_chunk(): invalid pointer") at ./malloc/malloc.c:5664
#7 0x00007f80394e3fdc in munmap_chunk (p=) at ./malloc/malloc.c:3060
#8 0x00007f80394e849a in __GI___libc_free (mem=) at ./malloc/malloc.c:3381
#9 0x00007f7fbc5dd1c5 in __gnu_cxx::new_allocator::deallocate (__t=, __p=, this=0x7fff39d1adf0) at /usr/include/c++/11/ext/new_allocator.h:145
#10 std::allocator_traits::deallocate (__n=, __p=, __a=...) at /usr/include/c++/11/bits/alloc_traits.h:496
#11 std::_Vector_base::_M_deallocate (__n=, __p=, this=0x7fff39d1adf0) at /usr/include/c++/11/bits/stl_vector.h:354
#12 std::_Vector_base::~_Vector_base (this=0x7fff39d1adf0, __in_chrg=) at /usr/include/c++/11/bits/stl_vector.h:335
#13 std::vector::~vector (this=0x7fff39d1adf0, __in_chrg=) at /usr/include/c++/11/bits/stl_vector.h:683
#14 FS::FSBuf::~FSBuf (this=0x7fff39d1adc0, __in_chrg=) at /home/cmen/Projects-Code/acq_proc/src/acq_proc/cpp/include/fs/fs_basic.h:22
#15 0x00007f7fbc5dbf45 in FS::FSModule::run (this=this@entry=0x560cb230b8e0, flagPlotStatus=flagPlotStatus@entry=12...
обратите внимание, что кадр №6 показывает причину сбоя «munmap_chunk(): неверный указатель», и мы переходим к кадру №15, который находится в последней строке функции FS::FSModule ::run, с помощью i locals я обнаружил, что локальная переменная «FSBuf buf» содержит векторы, к которым нет доступа. FSBuf — это структура, которая содержит несколько больших векторов, все векторы будут назначены в конструкторе FSBuf, чтобы избежать выделения памяти во время выполнения процесса вычислений. Когда я попытался использовать buf.xxx, некоторые векторы невозможно было распечатать, например
Я хочу знать, каковы возможные причины невозможности доступа к вектору? Я проверил код, нет возможности освободить или удалить векторы в buf.
Или какую информацию мне нужно получить какие-нибудь другие команды GDB?
Я новичок в gdb, так что, возможно, вопрос не ценный, но он меня очень смутил. Я обнаружил, что мой код иногда дает сбой, файл дампа ядра показывает, что сигналом сбоя является SIGABRT, а обратная трассировка – [code]#0 __pthread_kill_implementation (no_tid=0, signo=6, threadid=140188693307392) at ./nptl/pthread_kill.c:44 #1 __pthread_kill_internal (signo=6, threadid=140188693307392) at ./nptl/pthread_kill.c:78 #2 __GI___pthread_kill (threadid=140188693307392, signo=signo@entry=6) at ./nptl/pthread_kill.c:89 #3 0x00007f8039485476 in __GI_raise (sig=sig@entry=6) at ../sysdeps/posix/raise.c:26 #4 0x00007f803946b7f3 in __GI_abort () at ./stdlib/abort.c:79 #5 0x00007f80394cc676 in __libc_message (action=action@entry=do_abort, fmt=fmt@entry=0x7f803961eb77 "%s\n") at ../sysdeps/posix/libc_fatal.c:155 #6 0x00007f80394e3cfc in malloc_printerr (str=str@entry=0x7f8039621210 "munmap_chunk(): invalid pointer") at ./malloc/malloc.c:5664 #7 0x00007f80394e3fdc in munmap_chunk (p=) at ./malloc/malloc.c:3060 #8 0x00007f80394e849a in __GI___libc_free (mem=) at ./malloc/malloc.c:3381 #9 0x00007f7fbc5dd1c5 in __gnu_cxx::new_allocator::deallocate (__t=, __p=, this=0x7fff39d1adf0) at /usr/include/c++/11/ext/new_allocator.h:145 #10 std::allocator_traits::deallocate (__n=, __p=, __a=...) at /usr/include/c++/11/bits/alloc_traits.h:496 #11 std::_Vector_base::_M_deallocate (__n=, __p=, this=0x7fff39d1adf0) at /usr/include/c++/11/bits/stl_vector.h:354 #12 std::_Vector_base::~_Vector_base (this=0x7fff39d1adf0, __in_chrg=) at /usr/include/c++/11/bits/stl_vector.h:335 #13 std::vector::~vector (this=0x7fff39d1adf0, __in_chrg=) at /usr/include/c++/11/bits/stl_vector.h:683 #14 FS::FSBuf::~FSBuf (this=0x7fff39d1adc0, __in_chrg=) at /home/cmen/Projects-Code/acq_proc/src/acq_proc/cpp/include/fs/fs_basic.h:22 #15 0x00007f7fbc5dbf45 in FS::FSModule::run (this=this@entry=0x560cb230b8e0, flagPlotStatus=flagPlotStatus@entry=12... [/code] обратите внимание, что кадр №6 показывает причину сбоя «munmap_chunk(): неверный указатель», и мы переходим к кадру №15, который находится в последней строке функции FS::FSModule ::run, с помощью i locals я обнаружил, что локальная переменная «FSBuf buf» содержит векторы, к которым нет доступа. FSBuf — это структура, которая содержит несколько больших векторов, все векторы будут назначены в конструкторе FSBuf, чтобы избежать выделения памяти во время выполнения процесса вычислений. Когда я попытался использовать buf.xxx, некоторые векторы невозможно было распечатать, например [code](gdb) p buf.comp $48 = std::vector of length 1209600000, capacity 1209600000 = {6456, 7599, 6456, 0, 0, 0, 0, 280, -8, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49304, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7676, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4, 284, -19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 134, 17232, 134, 0, 0, 149, 126, -6, -1, 134, -2, 0, 0, 0, 0, 134, -2, -1, 0, 0, -4, 130, -3, 0, -3, 0, 0, 0, 0, 0, -1, 0, 134, -4, 0, 0, -2, 0, 0, 0, 5580, 22163, 5580, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0...} [/code] но к некоторым векторам доступ невозможен, например [code](gdb) p buf.conv $49 = std::vector of length 30240000, capacity 30240000 = {Cannot access memory at address 0x7f77d3d93010 [/code] FSBuf похож на [code]struct FSBuf { std::vector comp; std::vector conv; FSBuf::FSBuf(size_t comp_size, size_t conv_size); [/code] И конструктор похож на[code]FSBuf::FSBuf(size_t comp_size, size_t conv_size) : comp(comp_size), conv(conv_size) {} [/code] Я хочу знать, каковы возможные причины невозможности доступа к вектору? Я проверил код, нет возможности освободить или удалить векторы в buf. Или какую информацию мне нужно получить какие-нибудь другие команды GDB?