Приложение подключается к SFTP-серверу, загружает ежедневный файл, обрабатывает его, вставляет/запрашивает MySQL, а затем завершает работу.
В определенные дни приложение аварийно завершает работу сразу после закрытия сеанса SFTP.
Запуск приложения обычно дает:
Код: Выделить всё
free(): double free detected in tcache 2
Я запустил программу внутри GDB, чтобы зафиксировать точку сбоя:
Код: Выделить всё
#0 free()
#1 mysql_free_result() from libmysqlclient.so
#2 FMySql::FreeResult()
#3 DB_GetAAAction()
#4 FTPInDownload()
#5 ProcessFTPDownload()
#6 FTPIn()
#7 main()
Результаты Valgrind
Затем я запустил:
Код: Выделить всё
valgrind ./AppName 2> valgrind_result.txt
- "Недопустимое освобождение/двойное освобождение"
- Происходит во время очистки наборов результатов MySQL
- Происходит после обработки определенных данных
Что я могу сказать? подозрение
На основе как GDB, так и Valgrind:
- Есть какая-то ошибка от бывшего разработчика (возможно, бомба замедленного действия)?
- В коде приложения есть ошибка управления памятью
- В частности, в пути очистки результатов MySQL (mysql_free_result())
- Вероятно, вызвано определенными условиями данных (файл большего размера, другое
количество строк БД, пустой результат и т. д.) - Это не связано с ОС, сервером MySQL, файловой системой или средой.
- Нужно создать новое приложение с новыми настройками?
Среда
- RHEL 8.0
- Клиентская библиотека MySQL (libmysqlclient.so.21)
- Пользовательское собственное приложение (C++)
- SFTP → анализ данных → работа с базой данных → очистка → сбой
- Указывают ли выходные данные трассировки стека + valgrind на ошибку двойного освобождения
в приложении, а не в MySQL? - Может ли размер файла или содержимое данных реально вызвать другой
путь кода, который приводит к двойному освобождению?
- Рекомендации по предотвращению двойного освобождения при использовании mysql_free_result()?
- Должны ли указатели результатов всегда обнуляться после освобождения?
- Нужно ли мне что-то перепроверить на стороне системы, прежде чем
передавать это разработчикам?
Они не поверили моим выводам,
и когда они увидели, что я GDB,
они ударили меня бомбой, сказав, что это не тот инструмент для проверки.
Подробнее здесь: https://stackoverflow.com/questions/798 ... ree-in-mys
Мобильная версия