Wie den Grund eines Absturz herausfinden?
Wie den Grund eines Absturz herausfinden?
Hallo zusammen!
Ich brauche mal ein paar Tipps und Hinweis, um ein Problem zu lösen, wo ich keine Ahnung habe wie ich den Grund es Fehler finden kann.
Ganz grob: Auf einem Kundensystem läuft eine Server-Anwendung von mir. Sie nimmt Socket-Verbindungen entgegen und speichert den gesendeten Daten in einer Datei. Anschließend werden noch ein paar Einträge in einer MySQL-DB gemacht. Zusätzlich überträgt die Anwendung ebenfalls per TCP/IP-Socket Daten auf andere Systeme.
Nun zum Problem: Bei mir läuft die Applikation stabil ohne das ich einen Fehler produzieren kann. Beim Kunden stürzt die App. alle ein/zwei Wochen mal ab, ohne eine Fehlermeldung auszugeben. Man kann die App. dann wieder starten und sie läuft wieder wochenlang ohne Probleme.
Nur ich kann einfach nicht greifen, wo dieser Fehler auftreten kann. Im Dateihandling, beim Zugriff auf die DB, bei den Netzwerk-Aktionen?
Hat jemand eine Idee wie ich den Fehler einkreisen kann?
EDIT: Es ist Qt 3.3.4, VS 6.0, Dev-Maschine: WinXP SP2, Kundensystem: Win2000-Server SP4
Vielen Dank im voraus!
Markus
Ich brauche mal ein paar Tipps und Hinweis, um ein Problem zu lösen, wo ich keine Ahnung habe wie ich den Grund es Fehler finden kann.
Ganz grob: Auf einem Kundensystem läuft eine Server-Anwendung von mir. Sie nimmt Socket-Verbindungen entgegen und speichert den gesendeten Daten in einer Datei. Anschließend werden noch ein paar Einträge in einer MySQL-DB gemacht. Zusätzlich überträgt die Anwendung ebenfalls per TCP/IP-Socket Daten auf andere Systeme.
Nun zum Problem: Bei mir läuft die Applikation stabil ohne das ich einen Fehler produzieren kann. Beim Kunden stürzt die App. alle ein/zwei Wochen mal ab, ohne eine Fehlermeldung auszugeben. Man kann die App. dann wieder starten und sie läuft wieder wochenlang ohne Probleme.
Nur ich kann einfach nicht greifen, wo dieser Fehler auftreten kann. Im Dateihandling, beim Zugriff auf die DB, bei den Netzwerk-Aktionen?
Hat jemand eine Idee wie ich den Fehler einkreisen kann?
EDIT: Es ist Qt 3.3.4, VS 6.0, Dev-Maschine: WinXP SP2, Kundensystem: Win2000-Server SP4
Vielen Dank im voraus!
Markus
Bau vor und nach jeder kritischen Aktion eine Log Message ein, die in eine Datei ausgegeben wird, dann weißt du wenigstens was die letzte Aktion war, bevor die Applikation abraucht.
Verwendet die Anwendung Threads, kann das auch oft ein Problem sein, das nur unter ganz speziellen Umständen auftritt.
An sonsten falls möglich einen Debugger auf dem System installieren und an den Prozess der Anwendung hängen, dann kannst du evtl. wenigstens reindebuggen wenn die Anwendung crasht.
Verwendet die Anwendung Threads, kann das auch oft ein Problem sein, das nur unter ganz speziellen Umständen auftritt.
An sonsten falls möglich einen Debugger auf dem System installieren und an den Prozess der Anwendung hängen, dann kannst du evtl. wenigstens reindebuggen wenn die Anwendung crasht.
Bitte seid so nett und ändert den Titel von Beiträgen die gelöst wurden, auf [gelöst] Beitragstitel
Solche Debug-Messages habe ich schon teilweise eingebaut. Nur in der aktuellen Anzahl kann ich schon sagen, dass es unterschiedliche Stellen sind, wo der Absturz passiert.
Die Applikation verwendet keine Threads.
Hast Du einen Tipp, was für einen Debugger ich verwenden kann? Ich muss doch nicht das gesamte VS beim Kunden installieren, oder?
Die Applikation verwendet keine Threads.
Hast Du einen Tipp, was für einen Debugger ich verwenden kann? Ich muss doch nicht das gesamte VS beim Kunden installieren, oder?
Auch wochenlang? Oder nur gerade 5min...Bei mir läuft die Applikation stabil ohne das ich einen Fehler produzieren kann.
Neben einer RaceCondition (s. Volker) koennte es auch ein MemoryLeak sein (respektive auch zuviele, nicht freigegebene Childs eines lang lebenden QObjects). Hast du dir den Speicherverbrauch mal angeschaut?Beim Kunden stürzt die App. alle ein/zwei Wochen mal ab, ohne eine Fehlermeldung auszugeben. Man kann die App. dann wieder starten und sie läuft wieder wochenlang ohne Probleme.
Ja, ich habe auch Testsysteme hier laufen lassen. Der Kunde hat noch einen zweiten Server mit der Applikation und die hatte eine Update-Time von mehr als 500 Tagen. Nur hier waren nur 10 Clients maximal in Nutzung. Meine Testsysteme habe ich auch 30 Tage und mehr laufen lassen.
Was ich aber sagen muss, dass ich nicht die große Anzahl an Verbindungen habe, wie sie auf dem "Problem-Server" entstehen. Das wäre für mich die letzte Alternative, ein Clientprogramm zu schreiben, dass eine riesige Anzahl von Verbindungen generiert und das über einen längeren Zeitraum. Wobei meine Tests schon mit 600 Socketverbindungen gleichzeitig stabil gelaufen sind.
Der Speicherverbrauch ist "normal". Der Speicher der Applikation wächst nicht ständig an, sondern pendelt immer um 12 MB.
Was ich aber sagen muss, dass ich nicht die große Anzahl an Verbindungen habe, wie sie auf dem "Problem-Server" entstehen. Das wäre für mich die letzte Alternative, ein Clientprogramm zu schreiben, dass eine riesige Anzahl von Verbindungen generiert und das über einen längeren Zeitraum. Wobei meine Tests schon mit 600 Socketverbindungen gleichzeitig stabil gelaufen sind.
Der Speicherverbrauch ist "normal". Der Speicher der Applikation wächst nicht ständig an, sondern pendelt immer um 12 MB.
-
androphinx
- Beiträge: 170
- Registriert: 26. Januar 2009 09:19
- Wohnort: 127.0.0.2
Wenn du mit VS programmiert hast kannst du Remotedebuggen, das geht damit recht einfach. Müsste eig auch mit Eclipse gehen aber keine Ahnung wie.
Zum Thema loggen: kann ich dir nur die ACE empfehlen. Die haben da nen geilen Logmechanismus mit bei. Und aus dem kannst du dir deinen eigenen Logmanager bauen, der das log Verzeichnis mit überwacht!
Zum Thema loggen: kann ich dir nur die ACE empfehlen. Die haben da nen geilen Logmechanismus mit bei. Und aus dem kannst du dir deinen eigenen Logmanager bauen, der das log Verzeichnis mit überwacht!
Mit dem Programm "Dr. Watson", das ein Fehlerlog schreibt, wenn eine Applikation abstürzt, kann man schon etwas mehr sehen.
Nur kennt jemand das Logformat etwas besser und kann sagen, was dort passiert ist, außer dass der QString::operator= irgendetwas gemacht hat?
EDIT: Eine gute Anleitung zu Dr.Watson: http://www.a-m-i.de/tips/watson/watsonanalyse.php
Auszug aus dem Dr.Watson-Logs:
Nur kennt jemand das Logformat etwas besser und kann sagen, was dort passiert ist, außer dass der QString::operator= irgendetwas gemacht hat?
EDIT: Eine gute Anleitung zu Dr.Watson: http://www.a-m-i.de/tips/watson/watsonanalyse.php
Auszug aus dem Dr.Watson-Logs:
Code: Alles auswählen
[...]
Funktion: QString::operator=
39efe0a5 56 push esi
39efe0a6 57 push edi
39efe0a7 8b7c240c mov edi,[esp+0xc] ss:00948beb=ff070000
39efe0ab 8bf1 mov esi,ecx
39efe0ad 8b07 mov eax,[edi] ds:0169550c=746e6567
FEHLER ->39efe0af ff00 inc dword ptr [eax] ds:746e6567=????????
39efe0b1 e8aaffffff call QString::deref (39efe060)
39efe0b6 8b07 mov eax,[edi] ds:0169550c=746e6567
39efe0b8 5f pop edi
39efe0b9 8906 mov [esi],eax ds:0012ed40=007e2650
39efe0bb 8bc6 mov eax,esi
39efe0bd 5e pop esi
39efe0be c20400 ret 0x4
*----> Stack Back Trace <----*
FramePtr ReturnAd Param#1 Param#2 Param#3 Param#4 Function Name
0012ED28 004118FF 0169550C 00000000 016954B8 016954B8 !QString::operator=
0012ED6C 0042445B 00001BA7 009B7728 0012EDB0 39D5B971 !<nosymbols>
0012ED7C 39D5B971 00000009 0012EDCC 016954B8 39D576F8 !<nosymbols>
0012EDB0 39D5BB0B 016954B8 0012EDCC 016954E0 016954B8 !QObject::activate_signal
0012EE38 39F5680D 00000007 00001BA7 016954E0 39E674BB !QObject::activate_signal
0012EE84 39E6781E 0012EF58 004555D4 00A4BC20 0012EFD4 !QSocket::bytesWritten
0012EEA4 39EE7344 01758620 01001B7A 016954E0 004555D4 !QSocket::writeBlock
0012EEC0 39EE72D0 01758620 00001B7A 016954B8 39EE66C9 !QDataStream::writeRawBytes
0012EFE0 00411BF8 009CB130 00000000 016954B8 016954B8 !QDataStream::writeBytes
0012F014 00424449 009B7728 0012F054 39D5B971 00000008 !<nosymbols>
0012F020 39D5B971 00000008 0012F070 016954B8 39D576F8 !<nosymbols>
0012F054 39D5B7A5 009E0C28 0012F070 00002711 016954B8 !QObject::activate_signal
0012F0AC 39F567A9 00A528F8 016954B8 39E67D59 00000000 !QObject::activate_signal
0012F0F8 39D5B971 00000004 0012F148 009E0C28 39D576F8 !QSocket::connected
0012F12C 39D5BB0B 00000000 0012F148 0012F2C8 009E0C28 !QObject::activate_signal
0012F1B4 39F3C7E0 00000002 000000E0 009E0C28 39D73051 !QObject::activate_signal
0012F200 39D2C0D1 009E0C28 0012F2C8 0099FC40 0096BCE0 !QSocketNotifier::activated
0012F2A0 39D08590 009E0C28 0012F2C8 39D0DDF6 009E0C28 !QApplication::notify
0012F2E8 39D0DC34 00000000 0099FC40 009B6718 334A0496 !QApplication::sendEvent
0012F32C 39D36CD0 00000000 00000000 009B6718 01CCABC3 !QEventLoop::processEvents
0012F348 39D2C76C 01CCABC3 000000C8 004118F2 000000C8 !QEventLoop::processEvents
0012F398 0042445B 0001002F 009C6450 0012F3DC 39D5B971 !QApplication::processEvents
0012F3A8 39D5B971 00000009 0012F3F8 009B6718 39D576F8 !<nosymbols>
0012F3DC 39D5BB0B 009B6718 0012F3F8 009B6740 009B6718 !QObject::activate_signal
0012F464 39F5680D 00000007 0001002F 009B6740 39E674BB !QObject::activate_signal
0012F4B0 39E6781E 0012F584 004555D4 016BC9F8 0012F600 !QSocket::bytesWritten
0012F4D0 39EE7344 016E24B0 0103B0AC 009B6740 004555D4 !QSocket::writeBlock
0012F4EC 39EE72D0 016E24B0 0003B0AC 009B6718 39EE66C9 !QDataStream::writeRawBytes
0012F60C 00411BF8 015E6C00 00000000 009B6718 009B6718 !QDataStream::writeBytes
0012F640 00424449 009C6450 0012F680 39D5B971 00000008 !<nosymbols>
0012F64C 39D5B971 00000008 0012F69C 009B6718 39D576F8 !<nosymbols>
0012F680 39D5B7A5 009B5108 0012F69C 00002711 009B6718 !QObject::activate_signal
0012F6D8 39F567A9 009C1A70 009B6718 39E67D59 00000000 !QObject::activate_signal
0012F724 39D5B971 00000004 0012F774 009B5108 39D576F8 !QSocket::connected
0012F758 39D5BB0B 00000000 0012F774 0012F8F4 009B5108 !QObject::activate_signal
0012F7E0 39F3C7E0 00000002 000005C0 009B5108 39D73051 !QObject::activate_signal
0012F82C 39D2C0D1 009B5108 0012F8F4 0099FC40 00988D50 !QSocketNotifier::activated
0012F8CC 39D08590 009B5108 0012F8F4 39D0DDF6 009B5108 !QApplication::notify
0012F914 39D0DC34 00000000 0099FC40 39EDEB26 334A0496 !QApplication::sendEvent
0012F958 39D36CD0 00000000 009A9888 009A9888 01CC92CC !QEventLoop::processEvents
0012F974 39D2C76C 00000000 000000C8 0040E010 000000C8 !QEventLoop::processEvents
0012F9B4 0040E5E8 009F9FF8 015DBF08 0099CB20 00000000 !QApplication::processEvents
0012FA7C 0040DFE2 009ACD60 009A9888 0012FA84 00424A84 !<nosymbols>
0012FA98 39D5B971 00000030 0012FAE8 009A98F8 39D576F8 !<nosymbols>
0012FACC 39D5B7A5 00000000 0012FAE8 00000000 009A98F8 !QObject::activate_signal
0012FB24 39F3CE06 009AC580 009A98F8 39D75CB1 0012FC20 !QObject::activate_signal
0012FB64 39D2C0D1 009A98F8 0012FC20 0099FC40 007E9F08 !QTimer::timeout
0012FC04 39D08590 009A98F8 0012FC20 39D0D296 009A98F8 !QApplication::notify
0012FC3C 39D0D237 00005EF4 00000000 0012FC98 39D0DBA0 !QApplication::sendEvent
0012FC4C 39D0DBA0 00005EF4 0012FC68 007E6BC0 0099FC40 !QPtrVector<QTableItem>::at
0012FC98 39D36C12 00000004 0099FC40 00000000 39D36B87 !QEventLoop::processEvents
0012FEE4 00427865 00000002 0012FCA8 00400000 00000000 !QEventLoop::enterLoop
0012FF24 00427798 00400000 00000000 001337BF 0000000A !<nosymbols>
0012FFC0 77E989A5 0012FC78 0000020A 7FFDF000 C0000005 !<nosymbols>
0012FFF0 00000000 00427664 00000000 000000C8 00000100 kernel32!ProcessIdToSessionId
[...]