[Erledigt] In großen Programm Fehler mit AllocateMemory()

Fragen und Bugreports zur PureBasic 4.0-Beta.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8677
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

[Erledigt] In großen Programm Fehler mit AllocateMemory()

Beitrag von NicTheQuick »

Hallo alle da draußen,

ich habe momentan einen ärgerlichen Fehler in meiner RayTracing-Engine,
den ich gerne PB in die Schuhe schieben würde.

Momentan bin ich noch am Ausgrenzen des Bugs, weil er in kleineren
Test-Codes so nicht reproduzierbar ist.
Der Auslöser ist laut Debugger diese Zeile:

Code: Alles auswählen

*RTListElement = AllocateMemory(SizeOf(RTListElement))
Ich kriege dort einen "invalid memory access", aber viel falsch machen kann
man da ja kaum.

Aber jetzt kommt das noch merkwürdigere. Ersetze ich schon am Anfang
der komplette Quellcodes AllocateMemory() wie folgt durch globalalloc_(),
funktioniert die Zeile, aber ich bekomme wieder wo anders einen anderen
unerklärlichen Fehler.

Code: Alles auswählen

Macro AllocateMemory(Size)
  GlobalAlloc_(#GMEM_ZEROINIT, Size)
EndMacro
;...ganz viel Code...
;...noch ein bisschen Code
*RTListElement = AllocateMemory(SizeOf(RTListElement))
Es kann jetzt nicht zufällig schon jemand über den Fehler mutmaßen
ohne den ganzen Code zu kennen? Wenn doch, wär' das nämlich toll, weil
ich dann evtl. besser nach dem Fehler suchen könnte.

Ich glaube einfach mal, dass da vielleicht irgendwo ein Stapelfehler
auftritt, der da nicht aufzutreten hat.
Zuletzt geändert von NicTheQuick am 20.12.2006 11:32, insgesamt 1-mal geändert.
Bild
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Beitrag von DrShrek »

@Nic,

Wenigstens den Aufbau/Structure von RTListElement solltest Du uns nennen:
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Benutzeravatar
#NULL
Beiträge: 2235
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

ich hab schon von sowas ähnliches im forum gelesen, und andere konnten
das auch nicht reproduzieren. z.b. hier.
ich hab auch selber manchmal probleme mit sowas.
hab mal bilder gemacht:

beim ersten LoadImage() ist ein falscher dateiname
angegeben (bei "..\-img01.bmp" ist das minus falsch), der befehl schlägt also
fehl (siehe statusbar). aber der fehler wird an falscher
stelle angegeben. #1#
wenn ich noch eine belanglose zeile einfüge ("_TEST_LINE_Var=0")
wird dort der fehler angezeigt (man sieht nur das "=0" nicht, weil
das rote syntaxhighlighting in dem error-rot verschwindet). #2#
my pb stuff..
Bild..jedenfalls war das mal so.
freak
PureBasic Team
Beiträge: 766
Registriert: 29.08.2004 00:20
Wohnort: Stuttgart

Beitrag von freak »

An AllocateMemory() liegt es ganz bestimmt nicht, weil das ein simpler wrapper für HeapAlloc() ist.

Machst du irgendwas mit Threads in deinem Program ?
Die angezeigten Fehlerzeilen können falsch sein, wenn man Threads benutzt, aber nicht den Threadsafe Modus an hat.

Wenn das nicht der Fall ist, kann es noch sein das du irgendwo in deinem Program
über deine Speicherbereiche hinausschreibst, und damit die internen Strukturen
des Heaps überschreibst. Mit folgender Prozedur kann man das testen:

Code: Alles auswählen

Procedure HeapValidate()
  Protected Heap
  !extrn _PB_Memory_Heap
  !mov eax, [_PB_Memory_Heap]
  !mov [p.v_Heap], eax
  If HeapValidate_(Heap, 0, #Null) = 0
    MessageRequester("", "Heap invalid!")
  EndIf
EndProcedure
Ruf die mal vor deinem AllocateMemory() auf. Wenn der MessageRequester()
kommt, dann war das das Problem.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8677
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Beitrag von NicTheQuick »

Sorry an alle!

Hab meinen Fehler gefunden. ich hab tatsächlich an früherer Stelle nicht
genug Speicher für eine Struktur allokiert, in die ich geschrieben habe,
obwohl es ab einer bestimmten Stelle nicht mehr allokiert war.

Das ändert zwar nichts an der fehlerhaften Tatsache, dass er den Fehler in
genau dieser Zeile anzeigt, in der nichts schief gehen kann, aber egal.

Ich dachte schon ich spinne, dabei hatte ich einfach nur bei einem SizeOf()
ein Interface und nicht die zugehörige Struktur übergeben.

Jetzt muss ich den Bug doch nicht PB zuschieben. Ist ja auch besser so. <)


Aber Danke dennoch für alle Ideen. Die sind schließlich auch allgemein
nützlich.
Bild
Gesperrt