# Invalid Heap Pointer found  / Bad dynamic Heap Objects found



## ma-games.de (27. Mrz 2004)

Wie kommt unter der J2ME (MIDP 1.0 und CLD 1.0, Nokia UI) ein Absturz des Programms mit folgender Fehlermeldung zustande? 
_Invalid Heap Pointer found_
_Bad dynamic Heap Objects found_
Ich habe ein kleines Spiel für Handys programmiert, und manchmal stürzt das Spiel einfach ab. Angezeigt wird dann nur eine der zwei Fehlermeldungen. Es passiert sporadisch, also zu keinem bestimmten Zeitpunkt oder "Ort", und sehr selten. Könnte das auch durch eine fehlerhafte Implementierung mit der VM zu tun haben, oder liegt das Problem bei mir? 

Beim "googlen" habe ich als einzige Antwort folgendes gefunden: 
http://www.gamedev.net/community/forums/topic.asp?topic_id=205339
Dort weiß aber anscheinend auch niemand Antwort auf die Frage. Das einzige was ich daraus entnehmen kann ist, das es nicht unbedingt am Nokia UI API liegt.


----------



## Roar (27. Mrz 2004)

hmm ich kenn mich mit der J2ME zwar kein bisschen aus aber vielleicht hilft dir es ja  :? 
der Heap ist ja ein speicher. wär es möglich dass du falsche objekte in den speicher schreibst, oder den speicher irgendwie überfüllst? obwohl ich denke dass das eher eine sache der VM ist.


----------



## tomkruse (27. Mrz 2004)

Hi!

Also für mich klingt das so, als wäre es ein Bug in der internen Speicherverwaltung der KVM. Man hat ja als Programmierer gar keinen Einfluß darauf, wie der Heap verwaltet wird. Alles was man machen kann ist, Objekte anlegen und wieder auf null setzen. 

Manchmal wird der Heap zu klein und die KVM glaubt trotzdem noch, daß genügend Speicher zur Verfügung steht. Instanziert man dann ein Objekt, so kommt bei Nokia die Meldung "unable to run application". Dieses Szenario kann man umgehen indem man selbst den GarbageCollector mit Sytem.gc() aufruft.

Aber einen "invalid heap pointer" kann man selbst nicht durch Nachlässigkeit verursachen. Da muß irgendwas anderes passiert sein.

Cu - Tom.


----------



## ma-games.de (27. Mrz 2004)

Vielen Dank für Eure Meinungen. An einer Überfüllung des heap liegt es nicht. Dann würde entweder "unable to run application" oder "out of memory error" als Meldung kommen. Ich habe im Netz noch folgendes  interessantes gefunden:


> Bad dynamic Heap Objects found
> I have seen this error before when I was using the Runtime.date()
> function in the KVM. It took me a week to isolate the problem to
> Runtime.date() because it is a bug in the underlying code (behind the
> ...



Es scheint also das in der Entwicklungsphase von J2ME (die Mail-Wechsel stammt von 1999) schon solche Probleme gab und es wahrscheinlich an der KVM liegt.
Aber es wäre nicht schlecht wenn jemand genau bescheid wüßte.


----------



## tomkruse (27. Mrz 2004)

Hi!

Aber es gibt ja auch nicht DIE KVM, oder? Ich meine, die verschiedenen Hersteller haben doch auch verschiedene KVMs?!

Cu - Tom.


----------



## ma-games.de (27. Mrz 2004)

Ja, das stimmt natürlich. Ich habe auch schon gehört das im Siemens API ein fehler sein soll. Und im ersten Link den ich angegeben habe, haben die Leute dort ja auch mit Siemens Handys Probleme.


----------



## tomkruse (28. Mrz 2004)

Hi!

Ich glaube nicht, daß die Siemens API nur EIN Problem hat *g*
Da gips z.B. den berühmten switch-bug. Wenn man ein switch-case Konstruckt macht in dem positive und negative Werte gemischt sind, dann verweigert der indevice-Verifyer und behauptet "error verifiing class".

cu - Tom.


----------



## ma-games.de (29. Mrz 2004)

Ein neuer Fehler ist hinzugekommen: "heap corrupt"  :x 
Art u. Weise wie der Fehler zu stande kommt: siehe oben


----------



## tomkruse (29. Mrz 2004)

Hi!

Sag mal, um welches Modell handelt es sich eigentlich genau?

Cu - Tom.


----------



## ma-games.de (29. Mrz 2004)

Nokia 6610


----------



## tomkruse (30. Mrz 2004)

Hi!

Hm. Das hab ich auch, aber diesen Fehler hatte ich noch nie. Aber oft entstehen solche Fehler durch eine unglückliche Aneinanderreihung von Ereignissen, auf die auch die Entwickler der KVM beim Testen nie und nimmer draufkommen. 

Cu - Tom.


----------



## flateric (10. Mai 2004)

hi ma-games!

benutzt du DirectGraphics.FLIP_HORIZONTAL oder ähnliches? 
und hast du grafiken die über einen gesetzten setClip hinausragen? (z.b. einen hintergrund 128x128) auf dem objekte sind, die teilweise darüber hinausragen?
ich hatte das gleiche problem mit einem 6610. die parameter der setClip routine werden bei älteren s40 anscheinend falsch gesetzt. sie ist um einen pixel größer als angegeben. das habe ich zumindest festgestellt. nachdem ich einige anpassung gemacht habe hatte ich den fehler nicht mehr. es schien mir so als würde ein sprite in "fremden" speicher kopiert allerdings nur dann wenn ich mit DirectGraphics.FLIP (usw...) gearbeitet habe. 

gruß
flateric


----------

