LINUX.ORG.RU

Очень странный баг: *** glibc detected *** corrupted double-linked list


0

0

Уже не первый раз сталкиваюсь с совершенно непонятной мне ошибкой. Суть в том, что при некоторых уж очень странных обстоятельствах программа при завершении своей работы выдает такое (конец чуть обрезал, там много однообразного):

*** glibc detected *** mpkg: corrupted double-linked list: 0x0902f018 ***
======= Backtrace: =========                                             
/lib/libc.so.6(+0x701c4)[0xb732c1c4]                                     
/lib/libc.so.6(+0x733d0)[0xb732f3d0]                                     
/lib/libc.so.6(cfree+0x72)[0xb7332492]                                   
/lib/libc.so.6(+0x2ee6d)[0xb72eae6d]                                     
/lib/libc.so.6(+0x2eeaf)[0xb72eaeaf]                                     
/lib/libc.so.6(__libc_start_main+0xed)[0xb72d2b9d]                       
mpkg[0x80507c1]                                                          
======= Memory map: ========                                             
08048000-08069000 r-xp 00000000 08:05 3092       /usr/bin/mpkg           
08069000-0806a000 rw-p 00021000 08:05 3092       /usr/bin/mpkg           
0902f000-0a21d000 rw-p 00000000 00:00 0          [heap]                  
b6c00000-b6c21000 rw-p 00000000 00:00 0                                  
b6c21000-b6d00000 ---p 00000000 00:00 0                                  
b6d46000-b6d71000 r--p 00000000 08:05 50483      /usr/share/locale/ru/LC_MESSAGES/libc.mo
b6d71000-b6d9b000 r--p 00000000 08:05 600        /usr/share/locale/ru/LC_MESSAGES/mpkg.mo
b6d9b000-b6dda000 r--p 00000000 08:05 57950      /usr/lib/locale/ru_RU.utf8/LC_CTYPE     
b6dda000-b6ddc000 rw-p 00000000 00:00 0                                                  
b6ddc000-b6df2000 r-xp 00000000 08:05 112741     /lib/libpthread-2.11.so                 
b6df2000-b6df3000 r--p 00015000 08:05 112741     /lib/libpthread-2.11.so                 
b6df3000-b6df4000 rw-p 00016000 08:05 112741     /lib/libpthread-2.11.so                 
b6df4000-b6df7000 rw-p 00000000 00:00 0

Условия при которых такое случается - очень странные: сейчас это дело происходит исключительно если в директории есть директория с определенным именем, причем это имя никак с самой программой не связано.

Подскажите, что это, и как это отлаживать?

Уже начинаю грешить на баг в glibc, но интуиция подсказывает что это таки моя ошибка.

Такое бывает тогда, когда ты пишешь за границу аллоцированного массива.

Наиболее просто ищется валгриндом.

valgrind --db-attach=yes ./your-super-code

YesSSS ★★★
()
Ответ на: комментарий от YesSSS

А почему тогда я не получаю segmentation fault в этой ситуации? Программа отрабатывает полностью и до конца..

aix27249
() автор топика
Ответ на: комментарий от aix27249

Думаешь есть мало мест, которые можно переписать, не вызвав segfault? Ищи off-by-one ошибки.

slovazap ★★★★★
()

очевидно ж, ты перетер данные аллокатора glibc и когда тот полез освобождать память все свалилось

anonymous
()
Ответ на: комментарий от anonymous

Вроде как да, но совершенно неясно где это у меня может быть. Везде обычные std::string (а судя по валгринду - валится именно на их освобождении). В общем, буду копать, спасибо за наводки.

aix27249
() автор топика
Ответ на: комментарий от aix27249

Плюс ко всему мешает то, что программа уже большая, и код - огромный...

aix27249
() автор топика
Ответ на: комментарий от aix27249

> А почему тогда я не получаю segmentation fault в этой ситуации?

Segmentation fault возникает тогда, когда ты обращаешься по адресу вне своего адресного пространства. При этом не все твое адресное пространство - твои данные, часть из этих данных принадлежат glibc.

YesSSS ★★★
()
Ответ на: комментарий от aix27249

>Везде обычные std::string

А кроме std::string нигде больше динамически ничего не выделяется?

Elverion
()
Ответ на: комментарий от aix27249

Что valgrind выводит? Должен выводить два стека, первый - где буфер алоцирован, второй - где выход за границы массива. Если собираешь с -g - выведет даже строчки, если соберешь с -O0 - выведет даже правильные строчки. =)

YesSSS ★★★
()
Ответ на: комментарий от YesSSS

Всё, всем огромное спасибо, нашел :) Таки в одном месте была динамическая аллокация и кривой delete[], а я был в полной уверенности что уже избавился от этой стремной конструкции.

aix27249
() автор топика

Проверь еще все выделения памяти - может быть, выделяется меньше, чем тебе нужно, например, если ошибочно указан размер типа.

У меня выдавало такое, когда я выделял массив под структуры
и допустил такой баг

ptr=(struct my_struct*)malloc(N*sizeof(struct my_struct*));

//N*размер указателя, а не на размер структуры

Harald ★★★★★
()
Ответ на: комментарий от Harald

>ptr=(struct my_struct*)malloc(N*sizeof(struct my_struct*));

парад звезд? ;) он тебя сгубил :)

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.