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
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()
Valgrind-Ergebnisse
Dann habe ich Folgendes ausgeführt:
Code: Select all
valgrind ./AppName 2> valgrind_result.txt
- „Ungültiges freies/doppeltes freies“
- Tritt während der Bereinigung von MySQL-Ergebnissätzen auf
- Tritt auf, nachdem bestimmte Daten verarbeitet wurden
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?
Umgebung
- RHEL 8.0
- MySQL-Clientbibliothek (libmysqlclient.so.21)
- Benutzerdefinierte interne Anwendung (C++)
- SFTP → Datenanalyse → DB-Arbeit → Bereinigung → Absturz
- 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?
- Best Practices zur Vermeidung von Double-Free bei der Verwendung von mysql_free_result()?
- Sollten Ergebniszeiger nach Free immer auf Null gesetzt werden?
- Ist Gibt es irgendetwas, das ich auf der Systemseite noch einmal überprüfen sollte, bevor
das den Entwicklern weitergegeben wird?
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.
Mobile version