Anwendung stürzt nach SFTP-Vorgang ab, GDB und Valgrind zeigen bei der MySQL-Ergebnisbereinigung Double-Free anMySql

MySQL DBMS-Forum
Anonymous
 Anwendung stürzt nach SFTP-Vorgang ab, GDB und Valgrind zeigen bei der MySQL-Ergebnisbereinigung Double-Free an

Post by Anonymous »

Ich habe es mit einem wiederholten Absturz in einer benutzerdefinierten Linux-Anwendung zu tun und hoffe auf Rat, Bestätigung oder Vorschlag zur Grundursache.
Die Anwendung stellt eine Verbindung zu einem SFTP-Server her, lädt eine tägliche Datei herunter, verarbeitet sie, fügt MySQL ein bzw. fragt MySQL ab und wird dann beendet.
An bestimmten Tagen stürzt die Anwendung unmittelbar nach dem Schließen der SFTP-Sitzung ab.
Das Ausführen der App führt normalerweise zu Folgendem:

Code: Select all

free(): double free detected in tcache 2
GDB Stack Trace
Ich habe das Programm in gdb ausgeführt, um den Absturzpunkt zu erfassen:

Code: Select all

#0  free()
#1  mysql_free_result() from libmysqlclient.so
#2  FMySql::FreeResult()
#3  DB_GetAAAction()
#4  FTPInDownload()
#5  ProcessFTPDownload()
#6  FTPIn()
#7  main()
Dies deutet darauf hin, dass die Anwendung dasselbe MySQL-Ergebnis mehrmals freigibt.
Valgrind-Ergebnisse
Dann habe ich Folgendes ausgeführt:

Code: Select all

valgrind ./AppName 2> valgrind_result.txt
Valgrind meldet:
  • „Ungültiges freies/doppeltes freies“
  • Tritt während der Bereinigung von MySQL-Ergebnissätzen auf
  • Tritt auf, nachdem bestimmte Daten verarbeitet wurden
Valgrind bestätigt, dass Speicher zweimal freigegeben oder beschädigt wird, bevor er freigegeben wird.
Was ich Verdächtig
Basierend auf GDB und Valgrind:
  • Es gibt einen Fehler vom Ex-Entwickler (vielleicht eine Zeitbombe)?
  • Es gibt einen Speicherverwaltungsfehler im Anwendungscode
  • Speziell im MySQL-Ergebnisbereinigungspfad (mysql_free_result())
  • Wahrscheinlich durch bestimmte Datenbedingungen ausgelöst (größere Datei, unterschiedliche
    Anzahl von DB-Zeilen, leeres Ergebnis usw.)
  • Nicht durch Betriebssystem, MySQL-Server, Dateisystem oder Umgebung verursacht
  • Müssen Sie eine neue Anwendung mit neuem Setup erstellen?
Ich denke, dass der Codepfad bei bestimmten Logikverzweigungen dazu führt, dass mysql_free_result() zweimal auf demselben Zeiger aufgerufen wird.
Umgebung
  • RHEL 8.0
  • MySQL-Clientbibliothek (libmysqlclient.so.21)
  • Benutzerdefinierte interne Anwendung (C++)
  • SFTP → Datenanalyse → DB-Arbeit → Bereinigung → Absturz
Was ich brauche die Community
  • Deutet die Stack-Trace + Valgrind-Ausgabe eindeutig auf einen Double-Free
    Fehler in der App, nicht auf MySQL?
  • Könnten Dateigröße oder Dateninhalt realistischerweise einen anderen
    Codepfad auslösen, der zu Double Free führt?
Für Entwickler:
  • Best Practices zur Vermeidung von Double-Free bei der Verwendung von mysql_free_result()?
  • Sollten Ergebniszeiger nach Free immer auf Null gesetzt werden?
Für Systemadministratoren/Entwickler:
  • Ist Gibt es irgendetwas, das ich auf der Systemseite noch einmal überprüfen sollte, bevor
    das den Entwicklern weitergegeben wird?
Ich habe das sowohl an die Entwickler als auch an den ICT-Leiter weitergeleitet.
Sie haben meinen Erkenntnissen nicht geglaubt
und wenn sie I GDB sehen,
werfen sie mich mit der Begründung, das sei nicht das richtige Tool zum Überprüfen.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post