Autor |
Beitrag |
galagher
Beiträge: 2534
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Di 19.05.20 20:11
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
jaenicke
Beiträge: 19288
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 19.05.20 20:33
Den kompletten Stacktrace von dem Fehler haben wir bisher aber noch nicht gesehen.
Und da wir das ohne die passenden Daten nicht reproduzieren können, können wir auch nicht überlegen wo der Fehler sein könnte.
|
|
galagher
Beiträge: 2534
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Di 19.05.20 21:17
Einloggen, um Attachments anzusehen!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
jaenicke
Beiträge: 19288
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 19.05.20 22:37
Hmm, dann ist da schon richtig etwas kaputt, wenn es nicht einmal mehr einen richtigen Stacktrace gibt. Dann bleibt nur manuell durch debuggen...
Nach meinen bisherigen Erfahrungen mit Lazarus ist es durchaus nicht unwahrscheinlich, dass du dabei einen Bug findest.
|
|
galagher
Beiträge: 2534
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Mi 20.05.20 05:30
jaenicke hat folgendes geschrieben : | Hmm, dann ist da schon richtig etwas kaputt, wenn es nicht einmal mehr einen richtigen Stacktrace gibt. Dann bleibt nur manuell durch debuggen... |
Das Komische ist ja, dass es unter Lazarus, wenn man es im Debug-Modus ausführt, und dann, nach dem Auftreten des Fehlers, weiter ausführt, einfach ganz normal weiterläuft. Alles funktioniert, als sei nicht passiert. Nur ohne Lazarus, also "alleine", beendet sich das Programm einfach. Und ich kann das wie gesagt nicht abfangen. Zumindest weiss ich nicht, wie.
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
jaenicke
Beiträge: 19288
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 20.05.20 05:44
galagher hat folgendes geschrieben : | Und ich kann das wie gesagt nicht abfangen. Zumindest weiss ich nicht, wie. |
try..except klappt nicht?
Aber wie gesagt, interessant wäre ja an welcher Stelle genau der Fehler auftritt, wenn du durch den Quelltext debuggst, also durch TClipboard.GetFormats usw. (ich sehe dort z.B. eine Unterscheidung nach CanReadFromCache).
|
|
galagher
Beiträge: 2534
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Mi 20.05.20 06:27
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Th69
Beiträge: 4791
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mi 20.05.20 08:02
Tja, manchmal hilft Doku lesen.
Und auch bzgl. des SIGSEGV-Fehlers: Exceptions: Exception Classes
Füge die Unit SysUtils mal hinzu.
Dann solltest du aber zusätzlich einen try..except-Block um die fehlerhafte Funktion packen.
PS: Das Erzeugen der Stream-Objekte kannst du auch in die 2. Schleife packen (wie für das Formats-Array).
Und wenn du den Code wiederverwendbar machen möchtest, dann solltest du die Funktionalität in eine eigene Klasse packen (z.B. ClipboardSaver).
Für diesen Beitrag haben gedankt: galagher
|
|
galagher
Beiträge: 2534
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Mi 20.05.20 11:47
jaenicke hat folgendes geschrieben : | Aber wie gesagt, interessant wäre ja an welcher Stelle genau der Fehler auftritt, wenn du durch den Quelltext debuggst, also durch TClipboard.GetFormats usw. (ich sehe dort z.B. eine Unterscheidung nach CanReadFromCache). |
In clipbrd.pas ist GetFormats zwar deklariert, aber im implementation-Teil nicht vorhanden. Wo also finde ich CanReadFromCache?
Th69 hat folgendes geschrieben : | Und auch bzgl. des SIGSEGV-Fehlers: Exceptions: Exception Classes
Füge die Unit SysUtils mal hinzu.
Dann solltest du aber zusätzlich einen try..except-Block um die fehlerhafte Funktion packen. |
Seh ich mir an!
Danke für eure Tipps!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
jaenicke
Beiträge: 19288
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 20.05.20 12:29
|
|
galagher
Beiträge: 2534
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Mi 20.05.20 14:59
Th69 hat folgendes geschrieben : | Füge die Unit SysUtils mal hinzu. |
SysUtils ist eingebunden.
Th69 hat folgendes geschrieben : | Dann solltest du aber zusätzlich einen try..except-Block um die fehlerhafte Funktion packen. |
Nützt leider nichts.
Th69 hat folgendes geschrieben : | PS: Das Erzeugen der Stream-Objekte kannst du auch in die 2. Schleife packen (wie für das Formats-Array).
Und wenn du den Code wiederverwendbar machen möchtest, dann solltest du die Funktionalität in eine eigene Klasse packen (z.B. ClipboardSaver). |
Habe ich vor! Erstmal herausfinden, was da los ist.
jaenicke hat folgendes geschrieben : | Debugge doch einfach von der Zeile in deinem Quelltext aus durch. |
Zwei Möglichkeiten:
1. Das Programm wird mit einer SIGSEGV-Meldung abgebrochen, mit oder ohne try/except. Debuggen von der Zeile im Quelltext? Ich setzt einen Haltepunkt bei aFormats[i] := ClipBoard.Formats[i];, der Debugger hält mehrfach dort an, dann kracht es. Das except wird erst gar nicht angesprungen. ( ClipBoard.Formats; verwendet ja ClipBoard.GetFormats, da ist ein Haltepunkt also prinzipiell sinnvoll).
2. Es klappt alles wie gewünscht.
Mal so, mal so, aber nie mit RTF-Text oder Grafiken aktueller Programme. Wenn ich den RTF-Text mit LibreOffice in die Zwischenablage kopiere, befindet sich dort ein Format namens "Richtext Format". Wenn ich den RTF-Text mit Word in die Zwischenablage kopiere, gibt es dieses Format nicht. Ob das die Ursache ist, weiss ich nicht.
Ich kann leider nirgendwo CanReadFromCache finden, geschweige denn den Code von ClipBoard.GetFormats.
Welche Möglichkeiten gibt es noch, wenn try/except nichts nützen?
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
jaenicke
Beiträge: 19288
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 20.05.20 15:50
Einloggen, um Attachments anzusehen!
|
|
Th69
Beiträge: 4791
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mi 20.05.20 15:52
Läuft das Programm denn außerhalb der IDE (mit aktiviertem try..except) durch?
Hast du evtl. in der IDE "Halt on exception" in den Optionen aktiviert?
Und hast du nur einen leeren except-Block? Dann versuche mal
Delphi-Quelltext 1: 2: 3: 4: 5:
| try except on E : Exception do ShowMessage(E.Message); end |
|
|
galagher
Beiträge: 2534
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Do 21.05.20 19:53
jaenicke hat folgendes geschrieben : | Hast du noch nie schrittweise debuggt? Sprich F7 um in eine Methode hinein zu debuggen, F8 um darüber hinweg zu debuggen? |
F7 nicht so oft, aber F8 doch, natürlich, aber es war noch nie so mühsam wie diesmal, weil es ja nicht jedesmal zu diesem SIGSEGV kommt. Aber ich denke, ich habe die Stelle gefunden in win32winapi.inc in Prozedur TWin32WidgetSet.ClipboardGetData bei Size := Windows.GlobalSize(DataHandle);:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| function TWin32WidgetSet.ClipboardGetData(ClipboardType: TClipboardType; FormatID: TClipboardFormat; Stream: TStream): Boolean; var DataHandle: HGLOBAL; Data: pointer; Size: integer; {$IFDEF VerboseWin32Clipbrd} DbgFormatID: integer; {$ENDIF} Bitmap: TBitmap; BufferStream: TMemoryStream; BufferWideString: widestring; BufferString: ansistring;
function ReadClipboardToStream(DestStream: TStream): Boolean; begin Result := false;
DataHandle := Windows.GetClipboardData(FormatID); if DataHandle<>HWND(0) then begin Size := Windows.GlobalSize(DataHandle); |
Warum klappt es manchmal, dann wieder nicht? Und: Wenn ich das Programm einfach trotzdem weiter laufen lasse, wird die Grafik eingefügt und der ursprüngliche Inhalt der Zwischanablage ist wieder vorhanden!
Vor allem aber: Wie kann ich das nun beheben?
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
galagher
Beiträge: 2534
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Do 21.05.20 20:27
Mittlerweile bin ich mir nicht mehr sicher, dass das die einzige Stelle ist, bei der der Fehler auftritt. Denn wenn ich dort einen Haltepunkt setze und dann F8 drücke, läuft der Code weiter und dann erst kommt SIGSEGV.
Auch das Ummanteln der Codestelle mit try/except nützt nichts.
Weil der Fehler ja nicht jedesmal auftriff, ist das Debuggen wirklich mühselig.
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
galagher
Beiträge: 2534
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Do 21.05.20 20:35
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Th69
Beiträge: 4791
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Fr 22.05.20 15:36
Versuche mal einen eigenen "Runtime error" wie DivideByZero (x/0) auszulösen und zu fangen - klappt das denn?
|
|
galagher
Beiträge: 2534
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Fr 22.05.20 16:00
Th69 hat folgendes geschrieben : | Versuche mal einen eigenen "Runtime error" wie DivideByZero (x/0) auszulösen und zu fangen - klappt das denn? |
Ja, das klappt mit dem try/except. Ich habe mir eine kleine Prozedur gebastelt:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| var x, y: Double; begin try x := 1; y := 0; Caption := IntToStr(Round(x / y));
except ShowMessage('Fehler.'); end; end; |
Mit der IDE kommt zunächst eine SIGFPE-Fehlermeldung und die IDE markiert die Zeile Caption := IntToStr. Wenn ich das Programm weiter ausführe, springt es ins except und ShowMessage erscheint.
Ohne IDE springt es gleich ins except und ShowMessage erscheint.
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Th69
Beiträge: 4791
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Fr 22.05.20 17:07
Das, was mir dann noch einfällt, wäre die Source-Unit von TClipboard zu duplizieren (und einen anderen Klassennamen bzw. Namensbereich geben), dort dann uses SysUtils hinzufügen und mit dieser neuen Klasse noch mal auszuprobieren.
Edit: Oh, sehe gerade, daß der SIGSEGV-Fehler ja noch tiefer in der Klasse TWin32WidgetSet auftritt: Ist das eine Basisklasse von TClipboard?
Trotzdem probiere mal (zuerst) das oben beschriebene.
|
|
galagher
Beiträge: 2534
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Fr 22.05.20 17:20
Th69 hat folgendes geschrieben : | Das, was mir dann noch einfällt, wäre die Source-Unit von TClipboard zu duplizieren (und einen anderen Klassennamen bzw. Namensbereich geben), dort dann uses SysUtils hinzufügen und mit dieser neuen Klasse noch mal auszuprobieren. |
Aber in clipbrd.pp ist SysUtils bereits angegeben. Was meinst du?
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
|