Seite 3 von 4

Verfasst: 27.02.2008 08:41
von edel
Benutze OllyDbg. Gibt nichts besseres

http://www.ollydbg.de/

Verfasst: 27.02.2008 11:45
von mk-soft
Warum werden immer Threads als kritisch dargestellt, da bei sind diese doch eigendlich sehr gut zu handshaken.
Man muss sich nur ein kopft machen mit der sycronisation der Daten. Wenn man verstanden hat das die Zugriffe asyncron sind ist diese auch kein Problem.

In ein Projekt von laufen X Thread für Daten lesen und ein Thread um diese in eine Datenbank zu scheiben. Bei ein Kunde laufen schon ca 40 Thread für Daten lesen Plus 40 Thread als Watchdog Funktion.
Läuft alles einwandfrei :wink:

FF :wink:

Verfasst: 27.02.2008 20:17
von TWELVE
Warum werden immer Threads als kritisch dargestellt, da bei sind diese doch eigendlich sehr gut zu handshaken.
Danke...endlich ergreift mal jemand Partei für die armen Threads...:D
Benutze OllyDbg. Gibt nichts besseres
Danke..! Ist nen Superteil..

Ich konnte den Fehler mit dem Olly abfangen.Bin allerdings ratlos, wer ihn erzeugt.Der Fehler entsteht wohl dadurch, das ein Pointer eine Referenz auf eine illegale Speicheradresse präsentiert.

Der extra eingebaute OnError Code springt nicht an.Testweise eingebaute Div/0 bringt zuverlässig meinen OnError Requester auf den Schirm.

Ich habe so eine Ahnung, das der Fehler in einer Lib passiert, deren Funktionen ich im Program verwende.Insgesamt sind es 3 Libs, die verdächtige ist die PurePop3.Vielleicht ist das der Grund, das der Debugger und der OnError nix merken....?

Jemand noch ne Idee...?

Grüße

TWELVE

Verfasst: 28.02.2008 13:51
von TWELVE
Hallo,

ich bins nochmal.Ich hab jetzt ein kleines Problem beim Debuggen.Mir ist es ein paar Mal gelungen, mittels Debugger oder OnError einen Fehler abzufangen.

Da ist immer die Rede von Invalid Memory Access.Also es soll auf eine Adresse zugegriffen werden, die entweder unzulässig ist oder es nicht gibt ( z.B. 0 , -4053 usw.).Die Adresse steht in einem Pointer.Nur wie kommt sie da rein...? Ich beschreibe keine Memory Adressen in meinem Programm, nutze nur Variablen.Schaue ich mir dann die Zeilennummer des Fehlers an, steht da z.B. Delay(100).Kommentiere ich Delay aus, dann tritt der Fehler beim nächsten mal z.B. bei WaitWindowEvent()auf.Für mich sieht's irgendwie so aus, als würde da irgendwas einem anderen die Pointer über/zerschreiben, was dann im Invalid Access resultiert.Nen Stack Überlauf oder sowas...? Oder eine Variable braucht mehr Platz und schreibt einfach weiter...?

Was kann ich dagegen tun...? Ich hab doch gar keine Möglichkeit, den Speicher von Variablen zu beeinflussen...?

Das Problem wird dann sein, das der Bereich wo der Invalid Access auftritt nicht der Bereich ist, der ihn verursacht.

Ich bin frustriert...wie soll ich das jemals finden...? So macht Programmieren keinen Spaß mehr.

Grüße

TWELVE

Verfasst: 28.02.2008 16:17
von PMV
TWELVE hat geschrieben:
Warum werden immer Threads als kritisch dargestellt, da bei sind diese doch eigendlich sehr gut zu handshaken.
Danke...endlich ergreift mal jemand Partei für die armen Threads...:D
Vielleicht genau aus diesem Grund? :wink:

... wenn du Threadsafe nicht verwenden willst ... und glaubst es lieft an
einer der UserLibs, die du verwendest ... würd ich dir mal vorschlagen,
die UserLibs aus deinem Projekt zu entfernen.

MFG PMV

Verfasst: 28.02.2008 21:32
von mk-soft
Teilcode wäre hilfreich.
Versorgs du die Threads auch immer mit ein Parameter auch dann wenn diese nicht gebraucht werden? "Procedure MyThread(Dummy.l)"

FF :wink:

Verfasst: 29.02.2008 01:05
von TWELVE
Versorgs du die Threads auch immer mit ein Parameter auch dann wenn diese nicht gebraucht werden? "Procedure MyThread(Dummy.l)"
Nein, tue ich nicht.Da ich eh nur einen "Wert" ( Zahl) übergeben kann, nützt mir das nicht viel.Also laß es ich..:D

Ich bin nun testweise auf thread-safe umgestiegen, um mich weiter den Funktionen widmen zu können, da ich bis Montag einen gewissen Stand haben muß/will/soll.Bisher lief es damit immer stabil, aber nun hatte ich auch mit thread-safe eine Exception:

Ich wollte das Laden von 2 Dateien beim Start in einem Thread machen, damit das GUI nicht blockiert, während die Dateien geladen werden.
Dieser Thread tut genau, was er soll, aber sobald er auf EndProcedure läuft ( er soll sich dann selbst beenden, da ich dann nicht mehr brauche), gibt es eine Invalid Memory Access Exception.Write error at address 1.

Das "Lustige" ist, das ich auch sämtlichen Code innerhalb der Thread Procedure auskommentieren kann, und das trotzdem passiert.

Zu dieser Zeit läuft nur das Main, der gerade das Fenster aufgebaut hat und in die Eventloop geht. Ich kann mit diesem Scheiß langsam nix mehr anfangen.Ich habe langsam das Gefühl, das an Threads keiner ranwill, weil sie in PureBasic nicht sauber umgesetzt werden und deshalb dauernd auf Fresse fliegen.Sieht mir so aus, als wenn da irgendwelche Adressen überschrieben werden und dann deshalb die Pointer falsch sind.Ich mein, warum sollte mein Thread auf Adresse 1 zugreifen wollen...? Ich habs ihm nicht gesagt...?


Edit: der Hinweis mit dummy.l war gerade Gold wert..!!! Aus Gründen, die ich (noch) nicht verstehe, hat das meinen bockigen File-Loader Thread zum Laufen gebracht...:D Komisch isses aber trotzdem, da meine anderen Thread auch ohne dummy Parameter starten...

Wofür ist das wichtig..? Ich starte ja einige auch Procedures nur mit (), gilt dort das gleiche oder hat das nur mit den Threads zu tun..?


Grüße

TWELVE

Verfasst: 29.02.2008 01:22
von PMV
PB ist ein erster Linie ein "Ein-Mann-Projekt", da Fred alleine am Compiler
arbeitet. Funktionalität ist zwar höchstes gebot und zu einem hohen
Prozentsatz gegeben ... aber auch Fred ist nicht perfekt ... will sagen, in
PB kann sich zu jeder Version und somit zu praktisch jedem Release ein
Fehler einschleichen, und das betrifft alles, auch Threads.

Und zu der Dummy-Variable ... sollteste dir mal die Hilfe durchlesen.
CreateThread erwartet ein Parameter. Das ist kein optionaler Wert! Somit
muss die entsprechende Prozedur, welche als Thread laufen soll, einen
LONG-Parameter haben. Alles andere kann zu abstürzen führen und
somit zur instabilität eines Programms beihelfen.

Und ich wiederhole gerne noch mal ... Threads sind in PB genau so
verschriehen wie in anderen Sprachen, warum ... das solltest du langsam
verstanden haben.

MFG PMV

Verfasst: 29.02.2008 03:47
von TWELVE
Und zu der Dummy-Variable ... sollteste dir mal die Hilfe durchlesen.
CreateThread erwartet ein Parameter. Das ist kein optionaler Wert! Somit
muss die entsprechende Prozedur, welche als Thread laufen soll, einen
LONG-Parameter haben.
Natürlich bekommen meine Threads einen Wert mit.Das geht ja auch gar nicht anders weil sonst der Syntax Check meckert.PB hat es allerdings bisher nicht gestört, das die aufgerufenen Procedures keinen Wert erwartet haben.Wenn es also so essentiell wichtig ist, dann sollte der Syntax check merken, das ich da einen Wert schicke, aber meine Procedure gar keinen entgegennimmt.Wenn ich die Procedur als solche aufrufe und dann einen Wert mitsende, merkt das PB ja auch und bringt einen Fehler beim Compile.Für so kritische Sachen wie Threads sollte das erst recht gelten.In der Hilfe ist jedenfalls so nicht die Rede davon.Und da ich meinen Procedures meistens Strings übergebe, dachte ich mir, ok die Zahl vom Thread brauch ich dann nicht, also mach ich das anders und laß die Zahl einfach weg.Es lief ja auch eine lange Zeit.
Alles andere kann zu abstürzen führen und
somit zur instabilität eines Programms beihelfen.
Wie ich festgestellt habe, muß da was dran sein.Ich habe nun alle meine Thread-Procedures damit ausgerüstet.Ob das was bringt, muß ich erst testen, was nicht so einfach ist, da die Fehler ja nicht so oft und reproduzierbar auftreten.

Und ich wiederhole gerne noch mal ... Threads sind in PB genau so
verschriehen wie in anderen Sprachen, warum ... das solltest du langsam
verstanden haben.
Mmmh...wie soll man dann Asynchronität erreichen...? Ich habe genau deshalb Threads gewählt, weil ich damit genau das erreichen kann, was ich möchte.Der Thread, der Daten einsammelt, kann nicht warten, bis der Mailer die Mail rausgesendet hat, weil er sonst in der Zeit nichts loggen könnte.Im Prinzip läufts Spitze, bin sehr zufrieden mit meinem Ergebnis...wenn da nicht diese mysteriösen Abstürze wären.Ich selber kann damit vielleicht noch leben, aber wenn ich meine Arbeit anderen zur Verfügung stellen wollte, dann wäre das kein Zustand.

Ich bin offen für neues...wenn jemand einen besseren Vorschlag hat, wie man mehrere Sachen parallel bearbeiten kann und dabei das GUI noch flüssig reagiert - dann her damit.

PB ist ein erster Linie ein "Ein-Mann-Projekt", da Fred alleine am Compiler
arbeitet. Funktionalität ist zwar höchstes gebot und zu einem hohen
Prozentsatz gegeben ... aber auch Fred ist nicht perfekt ...
Das mag aus Sicht des Programmierers so richtig sein, aber PB ist nunmal keine Freeware, sondern wird kommerziell vertrieben.Ich weiß, es liegt am unteren Ende der Preisskala und ich fühl mich so richtig wohl damit, weil es mir von der früheren Amiga Intuition Programmierung sehr vertraut vorkommt.( da hieß CreateThread CreateTask wenn ich mich recht erinnere...:D).Nützt nur nix, wenn die Projekte - in die man ebenfalls viel Zeit reingesteckt hat - am Ende nicht richtig laufen bzw. crashen.

Multi-Threading ist meiner Meinung nach kein Hexenwerk - wie will man sonst 4 Kerne ausnutzen...? Programme mit hoher Anforderung an Rechenleistung wie MPEG Encoder usw. können aus mehreren Cores nur was rausholen, wenn sie mit mehreren Threads gleichzeitig rechnen.
Also sehe ich da keinen Fehler drin, Threads zu benutzen.
will sagen, in
PB kann sich zu jeder Version und somit zu praktisch jedem Release ein
Fehler einschleichen, und das betrifft alles, auch Threads.
Keine Software ist ohne Fehler.Soviel ist schonmal klar.Darum geht es aber auch gar nicht.Vielmehr hatte ich nach den Best-Practices für Thread-Verwendung gefragt.Siehe weiter oben...



Grüße

TWELVE

Verfasst: 29.02.2008 08:38
von HeX0R
TWELVE hat geschrieben:PB hat es allerdings bisher nicht gestört, das die aufgerufenen Procedures keinen Wert erwartet haben.Wenn es also so essentiell wichtig ist, dann sollte der Syntax check merken, das ich da einen Wert schicke, aber meine Procedure gar keinen entgegennimmt.Wenn ich die Procedur als solche aufrufe und dann einen Wert mitsende, merkt das PB ja auch und bringt einen Fehler beim Compile.Für so kritische Sachen wie Threads sollte das erst recht gelten.
Das ist nicht so einfach, da du ja nur die Adresse deiner Prozedur übergibst.
Z.B. kannst du diese Adresse auch irgendwo in deinem Code in einer Variable zwischenspeichern, um sie später zu benutzen, woher will der Compiler dann noch wissen wie der Prozedurkopf ausgesehen hat ?

Beispiel:

Code: Alles auswählen

Procedure Th(Dummy.l)

EndProcedure

*Address = @Th()


;irrsinnig viel Code
;

CreateThread(*Address, 0)
Oder deine Prozedur steckt gar in einer dll, woher will der Compiler denn dann wissen wie die Prozedur aussieht ?

Nicht alles muss von PB angemeckert werden, ab und zu darf man es auch mal selbst tun ;)
Aber du hast Recht, wenn man sich so durchs Forum liest finde ich bestimmt mindestens fünfmal den Hinweis nicht vergessen eine Dummyvariable in den Prozedurkopf zu setzen. (meistens von Edel) das sollte mal endlich richtig dick in die Hilfe.