INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

Debug von irregulären LV-Zuständen



Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!

12.06.2008, 16:22
Beitrag #1

gottfried Offline
LVF-Guru
*****


Beiträge: 1.735
Registriert seit: Mar 2007

2019
2004
EN

20**
Oesterreich
Debug von irregulären LV-Zuständen
Hallo,

ich setzte sozusagen am Ende des Thread
http://www.LabVIEWforum.de/index.php?showt...amp;#entry52012
an.

Faktum ist dass LV sich offensichtlich manchmal verirrt - auch offensichtlich "weil man Schwachsinn programmiert hat"

* fast nichts was man anklickt funktioniert
* keine Taste reagiert
* keine Karteikarte
* kein Scroll-Bar! auf der Fensterseite
* kein Menu ganz oben
* In diesem Zustand verbraucht LV 0% Rechenzeit
* Nur Stop und Unterbrechen kann man anklicken - das funktioniert.

Mit anderen Worten: da stimmt was nicht - das darf so nicht sein.

Klar - der erste Ansatz sollte wie immer sein: das VI aufräumen - das schafft zumindest Übersicht und das hilft einmal schon sehr viel weiter. Macht aber eins Scheissarbeit

Unklar ist mir aber noch immer, wie kann man LV "hereinlegen" da ist doch (fast) alles abgesichert. In C kann ich einem Pointer einen Text zuweisen und als Zieladresse für einen Sprung verwenden - zoiiing .... aber in LV?

Grundsätzlich läuft in jedem Sub-VI (alle Errorlines sind verbunden) mein Code am Ende auf eine Error Routine die mit dem Traceback & Errocode etc. ein append in einem Errorfile macht. Jeder numerische Errorcode wird auf den Errocluster geschrieben - das finde ich schon mal wichtig und präventiv.

Wenn IchSelbst schreibt

' schrieb:Sowas kommt gelegentlich vor, wenn eine While-Schleife ohne Zeitverzögerung läuft. => Irgendwas paralleles.
Es könnte auch an einem Handle liegen, das plötzlich nicht mehr da ist (verloren gegangen, versehentlich gelöscht). Das Handle würde z.B. zu einem DaqMX-Rd/Wr, vielleicht auch Visa-Rd/Wr, gehören. => auch was paralleles.

dann sollte das doch der Erroroutine am Ende des VIs auffallen - oder?

Wenn Xaran schreibt

' schrieb:Ich hätte, vielleicht, da noch eine Idee: Hast Du auch schon versucht, den entsprechenden Teil des Codes, wo es die Probleme gibt, noch mal zu löschen und neu zu schreiben? Ich hatte mal das tolle Phänomen, dass LV es nicht geschafft hatte, in eine Schleife reinzugehen. Nach 3 Tagen Fehlersuche hab ich die Schleife gelöscht, gespeicher, neu gezogen und siehe da, es ging.

Ja da ist das Problem dass ich nicht weis wo das Ding Mist macht.

Ich denke nun mal in zwei Richtungen:

1. Code aufräumen - ist leider "organisch" gewachsen (na immerhin ist er bio...)
2. manche Teile mit disable "ausschalten" und schauen was dann passiert

Wenn ich da jetzt Unsinn schreibe bitte um Nachricht, wenn jemand eine bessere Idee hat auch um Nachricht.

Danke

Gottfried

PS.: das Zusatzproblem ist die spezielle Hardware, die habe ich nicht im Office sondern in 200km Entfernung ....

mein wöchentlicher (eigenwilliger) Beitrag zur Innovation
http://innovation1.wordpress.com/
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
12.06.2008, 18:39
Beitrag #2

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.697
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
Debug von irregulären LV-Zuständen
Ich fang mal hier an:

' schrieb:* fast nichts was man anklickt funktioniert

Du musst dir so ein LV-Programm aus vielen parallelen Programmteilen vorstellen. Ein jeder dieser Programmteile heißt Thread. Jeder Thread hat eine Priorität. Es gibt Threads, die "nur selten" aktiviert werden brauchen und solche, die unbedingt "sehr oft" aktiviert werden müssen. Die Threads werden von einem übergeordneten Manager ausgeführt (respektive aktiviert) - und zwar dummerweise hintereinander (es sei denn du hast einen MultiCore). Ob der Manager das Betriebssystem ist oder ob er ein Teil des LV-Runtimesystems ist, spielt für das allgemeine Verständnis keine Rolle. Es gibt zwei Typen von Threads: Solche die sich freiwillig nach einer bestimmten Zeit beenden, und solche, die sich nicht freiwillig beenden - die "beendet" der Thraed-Manager dann mittels eines TimeShareing-Mechanismusses. Wenn ich hier von Zeiten spreche, dann sind das Zeiten zwischen 1 und 50 µs!

Stell dir vor, du hast einen Thread, der aus welchen Gründen auch immer eine (relativ) hohe Priorität hat. Das kann z.B. bedeuten, dass jedes zweite Zeitintervall von genau diesem Thread belegt wird. Für einen "niederwertigen" Thread könnte das jetzt aber bedeuten, dass er bis (um nur mal so eine Zahl zu sagen) zu einer Sekunde warten müsste, um einmal aufgerufen zu werden. Während dieses einen Mals kann der Thread selbst aber nur wenig tun.

Hier hast du jetzt also den Fall, dass ein Thread einen anderen ausbremsen kann. Wenn der ausgebremste Thread z.B. für das Abfragen der Mausklicks zuständig ist, wirst du feststellen: "fast nichts was man anklickt funktioniert". Wer der ausbremsende Thread ist, kann man durch diese Feststellung (nichts funktioniert) nicht feststellen.

Ein solcher Fall tritt z.B. dann ein, wenn in einer While-Schleife keine Zeitverzögerung ist. Die While-Schleife hat bezogen auf das Frontpanel eine sehr hohe Priorität - sie soll ja schließlich was leisten. Das Frontpanel braucht nur relativ langsam aktualisiert werden. Schneller als 100ms kann sowieso keiner kucken. Kommen jetzt aber doch mal viele Daten zum Refreshen an das FP, wird das FP Schwierigkeiten haben, diese auch anzuzeigen - es bleibt einfach nicht genug Zeit übrig, weil die While-Schleife zu viel für sich beansprucht.

Laufzeitprobleme dieser Art würde man über ein Abfragen von Errorclustern nicht feststellen können.

"Vorteil" dieses Fehlers: Die Rechenzeit liegt oft über 50%, sodass ein Erreichen von 100% sehr wahrscheinlich ist.


Zitat:* In diesem Zustand verbraucht LV 0% Rechenzeit
Hierfür habe ich folgende Erklärung.
Ein Thread höchster Priorität blockiert alle anderen Threads - und wartet selbst auf ein Ereignis von außen. Nur zu dumm: das Ereignis kommt nicht. Warum es nicht kommt, kann viele Gründe haben. Einer ist: der externe Programmteil hat "vergessen", dass er ein Event schicken soll. Mit anderen Worten: Ein Handle ist ihm kaputt gegangen.


Zitat:Unklar ist mir aber noch immer, wie kann man LV "hereinlegen" da ist doch (fast) alles abgesichert. In C kann ich einem Pointer einen Text zuweisen und als Zieladresse für einen Sprung verwenden - zoiiing .... aber in LV?
Softwarefehler in LV?
Guckst du meinen Thread über NI-CAN. Einmal hatte ich den Fall, dass mitten im Programmablauf sporadisch der Handle einer Queue verschwunden war. Warum? Keine Ahnung. Problem: Plötzlich ist das sporadische Verschwinden nicht mehr aufgetreten. Warum? Keine Ahnung.


Zitat:1. Code aufräumen - ist leider "organisch" gewachsen (na immerhin ist er bio...)
Dazu rate ich sehr.
Ganz extrem sage ich immer: Je weniger in einem Blockdiagramm steht, um so besser ist das SubVI. Unterprogramme, Unterprogramme, Unterprogramme ...
(Kleines Späßchen: Wenn nix mehr drinnen steht, kann auch kein Fehler mehr auftreten). Ob das Aufräumen des gewachsenen Codes nun "unangenehm" ist oder nicht - es gehört auf jeden Fall gemacht.

Zitat:2. manche Teile mit disable "ausschalten" und schauen was dann passiert
Das ist manchmal die einzige Möglichkeit.



Es gibt auch ganz ordinäre Möglichkeiten, warum dein Programm nicht geht. Du verwendest z.B. eine DLL, die einen Fehler hat. Der bewirkt, dass der Speichermanager oder der Threadmanager von LV durcheinander kommt. Der Fehler in der DLL (oder in der Konfiguration des DLL-Knotens) muss nicht zwangsläufig zu einer AccessViolation führen. Das ist ja das Dumme an gewissen Fehlern: Die Ursache und die Auswirkung eines Fehlers müssen nicht zwangsläufig zusammenhängen. Übertrieben gesagt: Der Fehler an sich kann hier und heute auftreten, eine Auswirkung aber erst übermorgen an einer ganz anderen Stelle.

Es bleibt dir praktisch nur das Disablen übrig. Und eine gewisse Erfahren, die du im Laufe des Programmiererlebens erwirbst, im Umgang mit Fehlern. Eine Erfahrung z.B. sagt: Die Vorschriften sind einzuhalten. Und zwar immer. Beispiel: Und selbst wenn eine einzige globale Variable das Programmieren erheblich vereinfachen würde - sie ist nicht zu verwenden.

Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
12.06.2008, 18:56
Beitrag #3

jg Offline
CLA & CLED
LVF-Team

Beiträge: 15.864
Registriert seit: Jun 2005

20xx / 8.x
1999
EN

Franken...
Deutschland
Debug von irregulären LV-Zuständen
Was mir zum Thema Lockup einfällt:

Verwendest du mehrere Event-Structures in ein- und demselben VI? Sowas führt nämlich sehr häufig zu so Phänomenen, nichts mehr klickbar, nichts reagiert. ...

Den Rest hat "IchSelbst" schon gesagt.

MfG, Jens

Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)

!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!

Einführende Links zu LabVIEW, s. GerdWs Signatur.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
13.06.2008, 11:08
Beitrag #4

gottfried Offline
LVF-Guru
*****


Beiträge: 1.735
Registriert seit: Mar 2007

2019
2004
EN

20**
Oesterreich
Debug von irregulären LV-Zuständen
Vielen herzlichen Dank nochmal für die ausführlichen Erklärungen.

Nein - ich verwende keine eigenen DLLs
Nein - ich verwende überhaupt nur eine Eventstruktur

Was ich mache:

1. meine lokalen Variablen auf globale umbauen damit ich das Ding einfacher zerhacken kann
2. ich blende die Struktur aus bei der mir meine Blase sagt dass sie Mist macht
3. ich zerhacke das ganze Problem in Datenerfassung & Auswertung und verpacke (die noch immer großen Dinger) in jeweils einem separaten VI
4. wenn das noch immer Scheiss macht werden das 2 EXE die über ihre Daten kommunizieren eingebaut in einem BATCH - ähh oder geht das eleganter?
5. wenn's noch immer zischt und raucht
6. fluchend komplett aufräumen (dabei können neue Bugs entstehen)

Vielen Dank

Gottfried

PS.: Eure Infos sind nicht nur für den aktuellen Fall für mich sehr interessant - in Zukunft spiele ich nicht mehr mit Proritäten von Strukturen :-)

mein wöchentlicher (eigenwilliger) Beitrag zur Innovation
http://innovation1.wordpress.com/
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
13.06.2008, 12:16
Beitrag #5

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.697
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
Debug von irregulären LV-Zuständen
' schrieb:1. meine lokalen Variablen auf globale umbauen damit ich das Ding einfacher zerhacken kann
:stop:NEIN, DAS MACHST DU NICHT! AbgelehntIwill
Mit Globalen Variablen, kannst du nämlich genau diesen Effekt erziehlen. Glaub mir, ich weiß von was ich rede. Nimm ein funktionales SubVI. Das ist nach außen wie eine globale Variable: Nämlich Speicher, der abrufbar ist. Nur eben die Verwaltung des Speichers, von der der Programmierer nichts merkt, ist eben ein ganz ein anderer.

Zitat:2. ich blende die Struktur aus bei der mir meine Blase sagt dass sie Mist macht
Try-und-Error-Verfahren. Das funzt, um es mit aktuellen Worten zu sagen. So mach ich das schon seit [*grübel*] fast 30 Jahren.

Zitat:3. ich zerhacke das ganze Problem in Datenerfassung & Auswertung und verpacke (die noch immer großen Dinger) in jeweils einem separaten VI
Noch eine gute Idee. "Und mach noch viele kleine SubVIs". Eine sehr gute Idee.

Zitat:4. wenn das noch immer Scheiss macht werden das 2 EXE die über ihre Daten kommunizieren eingebaut in einem BATCH - ähh oder geht das eleganter?
:blink:Wie? Da unterhalten sich jetzt zwei EXE, also zwei eigenständige Applikationen, miteinander? Wie machst du denn das? TCP/IP, File, oder wie?

Zitat:6. fluchend komplett aufräumen (dabei können neue Bugs entstehen)
Das glaub ich weniger.

Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
13.06.2008, 13:54
Beitrag #6

gottfried Offline
LVF-Guru
*****


Beiträge: 1.735
Registriert seit: Mar 2007

2019
2004
EN

20**
Oesterreich
Debug von irregulären LV-Zuständen
' schrieb:Mit Globalen Variablen, kannst du nämlich genau diesen Effekt erziehlen. Glaub mir, ich weiß von was ich rede. Nimm ein funktionales SubVI. Das ist nach außen wie eine globale Variable: Nämlich Speicher, der abrufbar ist. Nur eben die Verwaltung des Speichers, von der der Programmierer nichts merkt, ist eben ein ganz ein anderer.

Ähhh was meinst Du? Hast Du ein Beispiel? Im Forum kommt der Begriff 2x vor aber ich habe kein Beispiel gefunden.

Wo liegt der Unterschied und wieso sind Globals böse?

Danke für Deine Mühe

Gottfried

mein wöchentlicher (eigenwilliger) Beitrag zur Innovation
http://innovation1.wordpress.com/
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
13.06.2008, 15:01
Beitrag #7

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.697
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
Debug von irregulären LV-Zuständen
' schrieb:Im Forum kommt der Begriff 2x vor aber ich habe kein Beispiel gefunden.
Lass suchen nach "funktionales SubVI", dann findest du 8 Einträge. Auch diesen hier

Zitat:Wo liegt der Unterschied und wieso sind Globals böse?
Das ist wieder ein weites Feld.

Das Problem ist unter anderem die "Datensicherheit". Wenn du z.B. in parallelen While-Schleifen schreibend auf eine globale Variable zugreifen willst, muss LV Vorsorge treffen, dass nicht beide Tasks zur gleichen Zeit die Variable manipulieren können. Was an dieser Vorsorge kompliziert ist, ist aus diesen paar Wörtern hier gar nicht zu ermessen. Dumm nur, dass diese Vorsorge immer und bei jeder einzelnen Variablen gemacht werden muss. Und trotzdem funktioniert sie Sicherheit nicht immer. In 99,99% aller Fälle passiert gar nichts. Ein weniger schweren Fällen kommt es zu Race-Conditions, in extremen Fällen zu BlueScreen.

Außerdem: Laut Styleguide sind Globale Variablen zu vermeiden.

Naja, hie und da drücken wir mal beide Augen zu. Globale Variablen darfst du nur verwenden, wenn du auch die erheblichen Nachteile kennst. Nur: Wenn du sie kennst, wirst du sie nicht mehr verwenden.

Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
13.06.2008, 19:39
Beitrag #8

thomas.sandrisser Offline
LVF-SeniorMod


Beiträge: 1.298
Registriert seit: Sep 2005

xxxx
2005
EN

78759
United States
Debug von irregulären LV-Zuständen
' schrieb:Das Problem ist unter anderem die "Datensicherheit". Wenn du z.B. in parallelen While-Schleifen schreibend auf eine globale Variable zugreifen willst, muss LV Vorsorge treffen, dass nicht beide Tasks zur gleichen Zeit die Variable manipulieren können. Was an dieser Vorsorge kompliziert ist, ist aus diesen paar Wörtern hier gar nicht zu ermessen. Dumm nur, dass diese Vorsorge immer und bei jeder einzelnen Variablen gemacht werden muss. Und trotzdem funktioniert sie Sicherheit nicht immer. In 99,99% aller Fälle passiert gar nichts. Ein weniger schweren Fällen kommt es zu Race-Conditions, in extremen Fällen zu BlueScreen.

das gleiche problem hat man bei FGVs (functional global variables oder funktionales SubVI was ne deutsche uebersetzung ist die sich einfach nur piep anhoert) ebenfalls dass eine race condition auftreten kann bei komm zwischen zwei schleifen.
der einzig grosse vorteil von FGVs ist, dass ein error in und ein error out verdrahtet und somit der datenfluss ohne groesseren aufwand beeinflusst werden kann, was bei globalen variablen nicht moeglich ist.
Bei der performance wirst du nicht viel unterschied merken, ausser wenn die prioritaet auf subroutine gestellt ist



Und nun zum eigentlichen Problem:
LabVIEW reagiert uU deshalb nicht, weil der Code den du im anderen Thread gepostet hast, ws innerhalb einer EventStruktur liegt und das Event keine FP Aktionen zulaesst.
Disable die Lock funktion vom FP und es wird ganz normal laufen...


Angehängte Datei(en) Thumbnail(s)
   
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
14.06.2008, 10:55
Beitrag #9

gottfried Offline
LVF-Guru
*****


Beiträge: 1.735
Registriert seit: Mar 2007

2019
2004
EN

20**
Oesterreich
Debug von irregulären LV-Zuständen
' schrieb:LabVIEW reagiert uU deshalb nicht, weil der Code den du im anderen Thread gepostet hast, ws innerhalb einer EventStruktur liegt und das Event keine FP Aktionen zulaesst.
Disable die Lock funktion vom FP und es wird ganz normal laufen...

Ohhhhhh,

diese Schleife ist zwar nicht IN einer EventStruktur sonder außerhalb wird öfter mit Value(Signaling) gearbeitet ... ich probiere das einfach mal


Danke

Gottfried

mein wöchentlicher (eigenwilliger) Beitrag zur Innovation
http://innovation1.wordpress.com/
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
14.06.2008, 10:59
Beitrag #10

gottfried Offline
LVF-Guru
*****


Beiträge: 1.735
Registriert seit: Mar 2007

2019
2004
EN

20**
Oesterreich
Debug von irregulären LV-Zuständen
' schrieb:Lass suchen nach "funktionales SubVI", dann findest du 8 Einträge. Auch diesen hier

Pardon, wo soll der Vorteil liegen? Solch ein VI zu bauen macht einen Haufen Arbeit. Ich sehe auch unter extremen Voraussetzungen wie gleichzeitiger lese- und Schreibzugriff nur die Möglichkeit das Unsinn gelesen wird.... aber irreguläres Verhalten, blue-Screen....

Gottfried

mein wöchentlicher (eigenwilliger) Beitrag zur Innovation
http://innovation1.wordpress.com/
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Debug-Auswertung mijarena 20 13.971 24.03.2016 09:40
Letzter Beitrag: Lucki
  Anregungen für eine Debug Console für Kunden-Software dali4u 6 5.190 09.09.2013 10:30
Letzter Beitrag: dali4u
  Debug Tools gesucht Mrindfleisch 6 4.598 15.02.2013 07:34
Letzter Beitrag: Mrindfleisch
  Array mit Werten nach Zuständen aus zweitem Array in neue Arrays jedes Zustandes sortieren Mika 6 6.638 08.01.2011 19:17
Letzter Beitrag: Lucki
  Rückgabewert im Debug-Modus ok, sonst nicht Matze 4 4.299 22.10.2010 12:57
Letzter Beitrag: TSC
  Festhalten von Ablauf-Zuständen wohl 3 4.752 17.06.2009 21:22
Letzter Beitrag: schrotti

Gehe zu: