Windows Mobile debugger memory exhaustion
Heute hatte ich ein interessantes Problem mit meiner Windows Mobile Applikation. ICh habe es durch fehlerhafte Programmierung geschafft, den Windows Mobile Debugger des Visual Studio 2005 zu crashen.
Das Problem war, dass ich eine Funktion in einer fremden Library mehrfach aufgerufen habe und diese Funktion hat jedesmal einen Thread gestartet. Dadurch habe ich eine riesige Menge Threads generiert. Pro Thread muss der Debugger natürlich Speicher reservieren, was dazu führt, dass ihm der Speicher irgendwann mal ausgeht, wenn da hunderte Threads starten und sich wieder beenden, vorher aber schon wieder neue Threads gestartet werden…
Interessanterweise führte das Ganze aber nicht zu einem OOM, sondern der Debugger stürzte irgendwann mal ab. Hierfür dürfte ein fehlender Check im Debugger-Code von C:\Programme\Microsoft Visual Studio 8\SmartDevices\Debugger\bin\eDE.dll schuld sein (und das trotz installiertem SP1). Der Crash tritt an folgender Stelle auf:
6EDC070E 83C0 08 ADD EAX,8 6EDC0711 3BC7 CMP EAX,EDI 6EDC0713 74 1C JE SHORT eDE.6EDC0731 6EDC0715 8B30 MOV ESI,DWORD PTR DS:[EAX]
EAX = 8, EDI = 0
Wir schließen daraus, dass EAX hier nicht auf 0 geprüft wird sondern nur der Wert auf Offset 8 der Struktur, was schulssendlich zu einem Crash führt. Ich hab das Ganze gefixt, indem ich das ADD EAX, 8 hinter den Check verschoben habe, sodass nun der Zeiger auf 0 gprüft wird (dafür aber der Wert auf Offset 8 nicht mehr). Dies bewirkte immerhin, dass der Debugger nicht mehr crasht, scheinbar ist also doch die Wahrscheinlichkeit höher, dass der Strukturzeiger fehlt:
6EDC070E 3BC7 CMP EAX,EDI 6EDC0710 74 1F JE SHORT eDE.6EDC0731 6EDC0712 83C0 08 ADD EAX,8
Falls also jemand einen Crash in eDE.dll beim Debuggen hat, kann er meinen Patch theoretisch ausprobieren, vielleicht hilft es ja was.