Приложение аварийно завершает работу после операции SFTP, GDB и Valgrind показывают двойное освобождение в результате очMySql

Форум по Mysql
Ответить
Anonymous
 Приложение аварийно завершает работу после операции SFTP, GDB и Valgrind показывают двойное освобождение в результате оч

Сообщение Anonymous »

Я столкнулся с повторяющимся сбоем в пользовательском приложении Linux и надеюсь получить совет, подтверждение или предложение относительно основной причины.
Приложение подключается к SFTP-серверу, загружает ежедневный файл, обрабатывает его, вставляет/запрашивает MySQL, а затем завершает работу.
В определенные дни приложение аварийно завершает работу сразу после закрытия сеанса SFTP.
Запуск приложения обычно дает:

Код: Выделить всё

free(): double free detected in tcache 2
Трассировка стека GDB
Я запустил программу внутри GDB, чтобы зафиксировать точку сбоя:

Код: Выделить всё

#0  free()
#1  mysql_free_result() from libmysqlclient.so
#2  FMySql::FreeResult()
#3  DB_GetAAAction()
#4  FTPInDownload()
#5  ProcessFTPDownload()
#6  FTPIn()
#7  main()
Это говорит о том, что приложение освобождает один и тот же результат MySQL несколько раз.
Результаты Valgrind
Затем я запустил:

Код: Выделить всё

valgrind ./AppName 2> valgrind_result.txt
Valgrind сообщает:
  • "Недопустимое освобождение/двойное освобождение"
  • Происходит во время очистки наборов результатов MySQL
  • Происходит после обработки определенных данных
Valgrind подтверждает, что память освобождается дважды или повреждается перед освобождением.
Что я могу сказать? подозрение
На основе как GDB, так и Valgrind:
  • Есть какая-то ошибка от бывшего разработчика (возможно, бомба замедленного действия)?
  • В коде приложения есть ошибка управления памятью
  • В частности, в пути очистки результатов MySQL (mysql_free_result())
  • Вероятно, вызвано определенными условиями данных (файл большего размера, другое
    количество строк БД, пустой результат и т. д.)
  • Это не связано с ОС, сервером MySQL, файловой системой или средой.
  • Нужно создать новое приложение с новыми настройками?
Я думаю, что путь кода заканчивается тем, что вызывает mysql_free_result() дважды по одному и тому же указателю во время определенных логических ветвей.
Среда
  • RHEL 8.0
  • Клиентская библиотека MySQL (libmysqlclient.so.21)
  • Пользовательское собственное приложение (C++)
  • SFTP → анализ данных → работа с базой данных → очистка → сбой
Что мне нужно от сообщества
  • Указывают ли выходные данные трассировки стека + valgrind на ошибку двойного освобождения
    в приложении, а не в MySQL?
  • Может ли размер файла или содержимое данных реально вызвать другой
    путь кода, который приводит к двойному освобождению?
Для разработчики:
  • Рекомендации по предотвращению двойного освобождения при использовании mysql_free_result()?
  • Должны ли указатели результатов всегда обнуляться после освобождения?
Для системных администраторов/разработчиков:
  • Нужно ли мне что-то перепроверить на стороне системы, прежде чем
    передавать это разработчикам?
Я передал это как разработчикам, так и руководителю ICT.
Они не поверили моим выводам,
и когда они увидели, что я GDB,
они ударили меня бомбой, сказав, что это не тот инструмент для проверки.

Подробнее здесь: https://stackoverflow.com/questions/798 ... ree-in-mys
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «MySql»