Как найти место крэша?
От: k55 Ниоткуда  
Дата: 06.07.23 20:56
Оценка:
День добрый.
Есть сишная программка, которая после длительного времени работы крэшится.
Вот с таким стэком. И на консоли "double free or corruption (fasttop)"
Помимо этого потока есть основной и еще 12 потоков, которые спят.

  стэк
0
__libc_do_syscall
‎:
1
raise
‎/usr/src/debug/glibc/2.31+gitAUTOINC+1094741224-r0/git/signal/../sysdeps/unix/sysv/linux/internal-signals.h:86
2
abort
‎/usr/src/debug/glibc/2.31+gitAUTOINC+1094741224-r0/git/stdlib/abort.c:79
3
__libc_message
‎/usr/src/debug/glibc/2.31+gitAUTOINC+1094741224-r0/git/libio/../sysdeps/posix/libc_fatal.c:155
4
malloc_printerr
‎/usr/src/debug/glibc/2.31+gitAUTOINC+1094741224-r0/git/malloc/malloc.c:5347
5
_int_free
‎/usr/src/debug/glibc/2.31+gitAUTOINC+1094741224-r0/git/malloc/malloc.c:4177
6
__malloc_arena_thread_freeres
‎/usr/src/debug/glibc/2.31+gitAUTOINC+1094741224-r0/git/malloc/malloc.c:2964
7
start_thread
‎/usr/src/debug/glibc/2.31+gitAUTOINC+1094741224-r0/git/nptl/pthread_create.c:491
8
clone


В коде много мест где создаются различные потоки и даже есть fork().
Как сузить место поиска? Можно ли сказать что это точно не в fork() или наоборот?
Если это double free, то как это может быть связано с разрушением "арены" потока? Т.е. я не представляю код, который бы мог вызвать такую ошибку, раз повторное освобождение памяти случается при разрушении потока.
Означает ли это что стэк кто-то топчет?

Заранее спасибо!
Если есть желание — найдется 1000 возможностей.
Если нет желания — найдется 1000 причин.
Re: Как найти место крэша?
От: SkyDance Земля  
Дата: 06.07.23 23:33
Оценка: 4 (1)
k55>Как сузить место поиска?

А можно сделать ASAN build? Это могло бы сразу показать "топтуна", если он очевиден...
Re[2]: Как найти место крэша?
От: k55 Ниоткуда  
Дата: 07.07.23 20:48
Оценка:
SD>А можно сделать ASAN build? Это могло бы сразу показать "топтуна", если он очевиден...
Спасибо за наводку.
Собрал билд где тула использует asan библиотеку. Правда при старте пришлось руками указать LD_PRELOAD, а в случае статической линковки линкер не смог найти кучу функций из asan.
Теперь надо ждать воспроизведения ошибки.


Вчера по логам обнаружил какой тред упал. Вопрос, какой код его мог потоптать?
Тот что исполняется в pthread_create (start_routine) или код который до создания треда или код который после создания треда?
А точнее я пытаюсь понять, где расположена та память которая изтоптона и у какого кода есть "доступ" к нему в случае Out of Bound?
Если есть желание — найдется 1000 возможностей.
Если нет желания — найдется 1000 причин.
Re[3]: Как найти место крэша?
От: AleksandrN Россия  
Дата: 13.07.23 22:29
Оценка: 9 (1)
Здравствуйте, k55, Вы писали:

k55>Вчера по логам обнаружил какой тред упал. Вопрос, какой код его мог потоптать?

k55>Тот что исполняется в pthread_create (start_routine) или код который до создания треда или код который после создания треда?
k55>А точнее я пытаюсь понять, где расположена та память которая изтоптона и у какого кода есть "доступ" к нему в случае Out of Bound?

Собери с отладочной информацией и запусти под valgrind.
Re: Как найти место крэша?
От: VVV Россия  
Дата: 30.08.23 16:26
Оценка:
Здравствуйте, k55, Вы писали:

И на консоли "double free or corruption (fasttop)"
k55>Помимо этого потока есть основной и еще 12 потоков, которые спят.

Отправляешь ли между потоками указатели с подсчётом ссылок?

В этом случае поток1 отправляет указатель (с AddRef, конечно) в поток2. По стечению обстоятельств (как там потоки засыпают/просыпаются), может случиться, что Release произойдёт одновременно в двух потоках и очень редко может произойти двойное освобождение памяти (если не используются атомики).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.