Zufällige crashes in einem Nebenthread
Zufällige crashes in einem Nebenthread
Wir haben ein dickes Problem bekommen, und zwar ohne, dass ich als Programmierer viel dazu beigetragen habe. Die Engine an der wir basteln läuft nicht mehr rund auf dem PC des Artists (Raphael, auch hier im Forum), während sie auf meinem PC einfach nicht abstürzen will. Dabei passieren die Crashes auf seinem System immer nach zufälliger Zeit.
Ich hab gestern schon die komplette Source zu ihm rübergeschickt und per Teamviewer eine kleine Debug-Session gemacht. Raus kam viel komisches Zeug.
Das merkwürdigste ist, dass der Crash gar nicht an meinem Code liegen zu scheint, sondern in einem Nebenthread von Windows passiert.
Im Internet habe ich schon nach den Namen der betreffenden Funktionen gesucht und einige Seiten sagten mir, dass wohl gar ein anderer Prozess schuld sei! (http://blogs.msdn.com/b/ntdebugging/arc ... e-bad.aspx)
Aber wie soll man sowas debuggen?!
Angehängt ist ein Screenshot des Debuggers zur Zeit des Crashes. Ich bin mit meinem Latein auf jedenfall am Ende. Hat vielleicht von euch irgendjemand eine Ahnung wie man das beheben könnte?
System auf dem der Fehler auftritt: i7 920, Radeon 4890 neuester Treiber, Win7 Home
Ich hab gestern schon die komplette Source zu ihm rübergeschickt und per Teamviewer eine kleine Debug-Session gemacht. Raus kam viel komisches Zeug.
Das merkwürdigste ist, dass der Crash gar nicht an meinem Code liegen zu scheint, sondern in einem Nebenthread von Windows passiert.
Im Internet habe ich schon nach den Namen der betreffenden Funktionen gesucht und einige Seiten sagten mir, dass wohl gar ein anderer Prozess schuld sei! (http://blogs.msdn.com/b/ntdebugging/arc ... e-bad.aspx)
Aber wie soll man sowas debuggen?!
Angehängt ist ein Screenshot des Debuggers zur Zeit des Crashes. Ich bin mit meinem Latein auf jedenfall am Ende. Hat vielleicht von euch irgendjemand eine Ahnung wie man das beheben könnte?
System auf dem der Fehler auftritt: i7 920, Radeon 4890 neuester Treiber, Win7 Home
Re: Zufällige crashes in einem Nebenthread
Naja, RtlUserThreadStart im Callstack deutet erst einmal nur darauf hin, die Zugriffsverletzung tatsächlich in einem Nebenthread (und nicht im Hauptthread) auftritt. Im häufigsten Fall wurden die Threads vom User-Mode-Graphiktreiber erstellt; in diesem Falle schau erstmal, ob du nicht bei Benutzung der jeweiligen API doch irgendwelchen Unfug treibst. Insbesondere schau, wo der Hauptthread zum Zeitpunkt der Zugriffsverletzung steht, und ob dort irgendwelche graphikrelatierten Sachen sind, und dort auch alle Parameter an die Graphik-API in Ordnung sind.
Allerdings macht mich die Priorität von -3 für den Thread schon etwas stutzig; kann aber zum Zeitpunkt der Threadinitialisierung noch normal sein.
Allerdings macht mich die Priorität von -3 für den Thread schon etwas stutzig; kann aber zum Zeitpunkt der Threadinitialisierung noch normal sein.
Re: Zufällige crashes in einem Nebenthread
Tatsächlich ist bei den 2 Malen wo wir die Crashes abfangen konnten jedes Mal der andere Thread gerade bei Direct2D-Operationen gewesen. Hier bei "EndDraw()" vom Rendertarget.
Allerdings habe ich es gestern schon geschafft mich durch die komplette Funktion im Hauptthread durchzubringen indem ich abwechselnd die Crashmeldung weggeklickt und F10 gedrückt habe. Irgendwann ging es allerdings auch so nicht mehr weiter.
Wie sähe denn so ein Unfug, den ich betreiben könnte aus? Und wieso äußert der sich nur auf seinem PC? (Auf seinem Laptop, Radeon 5650 mittelalter Treiber scheint es zu laufen) Und wieso erst jetzt?
Hier ist übrigens die genaue Location vom Crash im Hauptthread (Leider ohne Symbole, und mir viel auch gerade der Schwachsinn mit bWindowMinimized auf. Meh.):
Allerdings habe ich es gestern schon geschafft mich durch die komplette Funktion im Hauptthread durchzubringen indem ich abwechselnd die Crashmeldung weggeklickt und F10 gedrückt habe. Irgendwann ging es allerdings auch so nicht mehr weiter.
Wie sähe denn so ein Unfug, den ich betreiben könnte aus? Und wieso äußert der sich nur auf seinem PC? (Auf seinem Laptop, Radeon 5650 mittelalter Treiber scheint es zu laufen) Und wieso erst jetzt?
Hier ist übrigens die genaue Location vom Crash im Hauptthread (Leider ohne Symbole, und mir viel auch gerade der Schwachsinn mit bWindowMinimized auf. Meh.):
- kimmi
- Moderator
- Beiträge: 1412
- Registriert: 26.02.2009, 09:42
- Echter Name: Kim Kulling
- Wohnort: Luebeck
- Kontaktdaten:
Re: Zufällige crashes in einem Nebenthread
Hast du die Windows-Debugsymbole bereits installiert. Dann siehst du zumindest die Funktionen, die knallen. Und such mal nach WinDbg als Debugger. Dazu kannst du dir unter Windows einstellen, dass er einen Crashdump schreibt, den öggnest du dann mit WinDbg und anaylsierst das Ganze ( mit korrekt eingestellten Symbolen ), was scheif geht. So siehst du nur unvollständige Info's, die wahrscheinlich nicht einmal ganz richtig sind.
Einige hilfreiche Links dazu:
http://forums.plexapp.com/index.php/top ... n-windows/
http://stackoverflow.com/questions/7342 ... pplication
Gruß Kimmi
Einige hilfreiche Links dazu:
http://forums.plexapp.com/index.php/top ... n-windows/
http://stackoverflow.com/questions/7342 ... pplication
Gruß Kimmi
Re: Zufällige crashes in einem Nebenthread
Die Symbole müsste ich auf meinem Rechner haben. Sonst kann ich sie ja auch schnell nachladen. Dass man WinDbg auch für soetwas benutzen kann wusste ich noch gar nicht. ;) Ich hab es nur benutzt mir die Bluescreens wegen meinem kaputten RAM erklären zu können.
Re: Zufällige crashes in einem Nebenthread
Hier ist übrigens noch ein Shot aus VS, bei dem überhaupt keine D2D-Funktionen in diesem Frame aufgerufen wurden.
Re: Zufällige crashes in einem Nebenthread
Habe [w]tech jetzt wieder fast eine Stunde auf dem Laptop laufen gelassen, keinerlei Problem. Könnte es eventuell an meinem Desktop liegen? An sich läuft da alles sehr stabil, nahezu nie Abstürze. Aber [w]tech ist soweit das anforderungsstärkste Programm was ich laufen lasse in Bezug auf DirectX. Die Crashes treten immer innerhalb von 20-25min auf.
- CodingCat
- Establishment
- Beiträge: 1857
- Registriert: 02.03.2009, 21:25
- Wohnort: Student @ KIT
- Kontaktdaten:
Re: Zufällige crashes in einem Nebenthread
Übrigens gibt es auf Windows x64 offenbar einige Probleme beim Debuggen von Crashes, folgender Artikel kam gerade via Twitter rein: When even crashing doesn't work. Vielleicht hilft es.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
- Krishty
- Establishment
- Beiträge: 8350
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: Zufällige crashes in einem Nebenthread
So wie ich das sehe, setzt das aber voraus, dass man einen 32-Bit-Prozess auf einer AVX-kompatiblen CPU ausführt. Die Kombination ist so dämlich, dass sie mir wohl auch durch die Qualitätssicherung geflutscht wäre.
Re: Zufällige crashes in einem Nebenthread
Nun, da ich gerade lese, dass AVX das erste mal von Intel 2011 verbaut wurde, denke ich nicht, dass das zutrifft.
Wir hatten aber eben gerade einen sehr sehr interessanten, aber auch verdammt merkwürdigen Fall. Da wir im Hauptthread immer um irgendwelche Direct2D-Funktionen herrum waren, als es crashte, habe ich Raphael mal gebeten einfach das InEditor-Game zu starten. Das ist einfach eine Version des Spielmodis der Engine, welche man direkt aus dem Editor raus starten kann. Es wird allerdings, anders als beim Editor, keine einzige D2D-Funktion benutzt.
Nun funktioniert das ganze wie folgt: Startet man die Engine mit einem passenden Parameter, so wird dieses PlayInEditor-Game (PIE-Game) gestartet.
Es wird also im Editor eine Map gespeichert, dann via CreateProcess() ein neuer Prozess der Engine erstellt (Selbe .exe wie der Editor!), nur eben mit den passenden Argumenten.
Dann, und jetzt kommts, wir per WaitForSingleObject() im Editor gewartet bis das PIE-Game beendet wurde (Wird später noch ersetzt, Windows denkt nämlich der Editor würde hängen).
Das PIE-Game wurde also gestartet und dann hieß es warten. Und es stürzte nach einiger zeit auch etwas ab! Aber nicht das PIE-Game. Der Editor! Während er noch in WaitForSingleObject() steckte!
Ich glaube jetzt verstehe ich absolut nur noch Bahnhof :(
Wir hatten aber eben gerade einen sehr sehr interessanten, aber auch verdammt merkwürdigen Fall. Da wir im Hauptthread immer um irgendwelche Direct2D-Funktionen herrum waren, als es crashte, habe ich Raphael mal gebeten einfach das InEditor-Game zu starten. Das ist einfach eine Version des Spielmodis der Engine, welche man direkt aus dem Editor raus starten kann. Es wird allerdings, anders als beim Editor, keine einzige D2D-Funktion benutzt.
Nun funktioniert das ganze wie folgt: Startet man die Engine mit einem passenden Parameter, so wird dieses PlayInEditor-Game (PIE-Game) gestartet.
Es wird also im Editor eine Map gespeichert, dann via CreateProcess() ein neuer Prozess der Engine erstellt (Selbe .exe wie der Editor!), nur eben mit den passenden Argumenten.
Dann, und jetzt kommts, wir per WaitForSingleObject() im Editor gewartet bis das PIE-Game beendet wurde (Wird später noch ersetzt, Windows denkt nämlich der Editor würde hängen).
Das PIE-Game wurde also gestartet und dann hieß es warten. Und es stürzte nach einiger zeit auch etwas ab! Aber nicht das PIE-Game. Der Editor! Während er noch in WaitForSingleObject() steckte!
Ich glaube jetzt verstehe ich absolut nur noch Bahnhof :(