DLL streikt nach einigen -zig Aufrufen

22/02/2010 - 23:02 von Paul Lenz | Report spam
Ich schreibe gerade ein Programm in Rapid-Q, (ein entfernter
Verwander von VB) und dazu eine DLL in C. Es geht dabei um
die Untersuchung von Bildern. Mein Problem ist, dass die DLL
nach ca. 100 bis 200 Aufrufen keine Daten mehr zurück gibt.

Das Basic-Programm erstellt ein Array aus Bitmaps sowie ein
Array aus Integern. Die Bitmaps werden mit Bildern geladen.
Das Array bekommt Daten wie Breite und Höhe eines Bildes
und einen Pointer auf eine Bitmap. Dann wird die DLL mit
einem Pointer auf das Array aufgerufen. Die DLL macht ein
paar Untersuchungen, schreibt 4 Ergebnisse auf das Array
und beendet sich. Das Basic-Programm entnimmt diese Werte
aus dem Array und arbeitet damit weiter.

Dies funktioniert leider nicht beliebig oft. Irgendwann scheint
das Array eine Art Schreibschutz für die DLL zu bekommen.
Ich lasse das Basic-Programm die betreffenden Glieder des
Arrays mit -1 belegen und rufe die DLL auf. Diese überschreibt
gleich zu Beginn diese Glieder testweise mit anderen negativen
Werten und beginnt dann die eigentliche Arbeit, wobie die 4
Werte grundsàtzlich positive Werte sind. Eine Ausgabe mit
printf() zeigt, dass diese Werte korrekt ermittelt werden (was
beweist, dass das Array immer noch korrekt Bildbreite, Bildhöhe
und Pointer übergibt), aber das Basic-Programm bekommt
die -1 zurück.

Das Problem tritt unabhàngig vom untersuchten Bild auf. Die
DLL macht nichts anderes als die 4 Grundrechenarten und wird
ordnungsgemàß beendet. Es gibt garantiert keine Division durch
Null und keinen Zugriff über den Speicherbereich der Bitmap hinaus.
Der Windows-Taskmanager zeigt keinen wachsenden Speicher-
verbrauch.

Mehr fàllt mit leider nicht ein, ich bin auch alles andere als ein
C-Spezialist. Gibt es außer den oben genannten noch andere
"übliche Verdàchtige"?


Paul Lenz
 

Lesen sie die antworten

#1 Marcel Müller
23/02/2010 - 11:41 | Warnen spam
Hallo,

Paul Lenz wrote:
Ich schreibe gerade ein Programm in Rapid-Q, (ein entfernter
Verwander von VB) und dazu eine DLL in C. Es geht dabei um
die Untersuchung von Bildern. Mein Problem ist, dass die DLL
nach ca. 100 bis 200 Aufrufen keine Daten mehr zurück gibt.



1. Programm nach undefined behavior durchforsten. Möglicherweise wird
irgendwo bei einer Reallokation der Pointer nicht aktualisiert.
2. Gucken, das keine Ressourcenlecks drin sind. Nicht geschlossene Files
oder so.
3. C-Runtime unbedingt als DLL binden.
4. Jeden Methodenaufruf, der einen Fehler liefern kann auch überprüfen.

Dies funktioniert leider nicht beliebig oft. Irgendwann scheint
das Array eine Art Schreibschutz für die DLL zu bekommen.



5. Es gibt keinen Schreibschutz, der nicht zum Sofortigen
Programmabbruch per Access-Violation führen würde.
Falls das Programm also überhaupt an dem Punkt, wo die Werte von der DLL
geschrieben werden vorbei kommt, hat es undefiniertes Verhalten, da
offensichtlich bewiesen ist, dass nicht an die gewünschte Stelle
geschrieben wird.
6. Ohne Codebeispiel wird kaum vernünftige Hilfe kommen.


Marcel

Ähnliche fragen