LabVIEWForum.de - Absturz durch unzulässige Pointer

LabVIEWForum.de

Normale Version: Absturz durch unzulässige Pointer
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo liebe Community,

ich habe ein Problem bei der Übergabe von Daten zwischen LabView und meiner Speicherimplementierung als Library Function Node (dll). Kurz zum Aufbau: es laufen in zwei parallelen while-Schleifen Aufnahme- und Ausgabe-Tasks, zwischen diesen sollen Daten ausgetauscht werden. Zunächst wird für diesen Austausch ein Speicherbereich (Ringspeicher) initialisiert. Beim Lesen&Schreiben werden Datenpointer verwendet, beim Schreiben wird der Array Data Pointer (Input von Node) verwendet um eine Kopie in den Speicher anzulegen, beim Lesen wird ein Array Data Pointer (Input von Node) von LabView genutzt und in diesen werden die Daten dann aus dem Speicher übertragen (Output von Node).

Ein Debuggingreport hat ergeben, dass scheinbar des öfteren unzulässige Pointer wie 0x00000000 und 0xFFFFFFFF übergeben werden. Fehlerbild ist leider etwas schwer zu beschreiben, da LabView entweder sich selbstständig schließt/abstürzt oder eine bug registriert, versucht zu debuggen, dann zum schließen auffordert. Problem ist, dass die Abstürze völlig willkürlich erscheinen, manchmal nach längeren Betrieb (eher selten), manchmal beim schließen der Tasks (nicht beim ersten Aufruf), manchmal bei der Initialisierung (nicht beim ersten Aufruf). Zudem scheint meist der erste Lauf keine Abstürze zu erzeugen, sondern erst bei neuem Aufruf des VIs. Es scheint als würde mein angelegter Speicher in den von LabView eingreifen und damit Fehler erzeugen. Hat jemand Erfahrung mit der Speicherverwaltung von LabView und kann sagen, wann ein Speicher den Pointer 0x00000000 oder 0xFFFFFFFF erhalten würde? Zusätzlich die Frage, ob ein Shiftregister/globale Variablen immer feste Adressen haben oder dynamisch verwaltet werden? Idee war, dass evtl. LabView den Array Data Pointer vorzeitig auf unzulässige Werte setzt wenn die dll versucht die Daten zu holen.

Zusatz: Speicher ohne Aufnahme- und Ausgabe-Task funktioniert -scheinbar- ohne Probleme. Erst wenn die Tasks hinzukommen stürzt LabView ab.

Ich bin über jede Hilfe dankbar!
Verstehe ich richtig, du hast eine externe Speicherimplementation mit Pointers (also nicht in LabVIEW) geschrieben, und beschwerst dich jetzt über Abstürze in LabVIEW durch diese DLL? Dann such mal in deiner DLL...

Gruß, Jens
(25.10.2016 18:21 )VS_03 schrieb: [ -> ]Kurz zum Aufbau: es laufen in zwei parallelen while-Schleifen Aufnahme- und Ausgabe-Tasks, zwischen diesen sollen Daten ausgetauscht werden.
Die erste Wahl zum Austausch von Daten zwischen zwei While-Schleifen heißt Queue ...

Zitat:Zunächst wird für diesen Austausch ein Speicherbereich (Ringspeicher) initialisiert.
Und das passiert in deiner DLL?

Warum verwendest du eine DLL zum Austauschen von Daten? Ich hoffe doch mal, du tust in der DLL wenigstens sonst noch was?

Zitat:Zudem scheint meist der erste Lauf keine Abstürze zu erzeugen
Das scheint aber auch nur so. Das dumme an einer AV ist, dass deren Auftreten und deren Auswirkung in den aller meisten Fallen in keinerlei zeitlichem Zusammenhang stehen.

Zitat:Zusätzlich die Frage, ob ein Shiftregister/globale Variablen
Globale Variablen? Selbstverständlich, und gerade wenn sie Arrays enthalten, werden die dynamisch verwaltet ...
Das Problem hat sich gelöst, für Leute die auf ein ähnliches Problem stoßen. Es ist hilfreich bei Verwendung von eigenen structs zu schauen, ob die Länge auch passt, da unter umständen in anderen Paketlängen gearbeitet wird, sodass die Länge der Pakete länger ist als eigentlich angenommen.
Referenz-URLs