AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi 10.4: Was kann einen Absturz bei der Auflösung von "MyObject as TType" verursachen ?

10.4: Was kann einen Absturz bei der Auflösung von "MyObject as TType" verursachen ?

Ein Thema von Rollo62 · begonnen am 12. Jun 2020 · letzter Beitrag vom 17. Jun 2020
Antwort Antwort
Rollo62

Registriert seit: 15. Mär 2007
3.896 Beiträge
 
Delphi 12 Athens
 
#1

10.4: Was kann einen Absturz bei der Auflösung von "MyObject as TType" verursachen ?

  Alt 12. Jun 2020, 16:28
Delphi-Version: 10.4 Sydney
Hallo zusammen,

ich teste gerade unter Rx10.4,
und ich habe einen seltsamen Crash unter iOS, das dürfe aber mit iOS nichts zu tun haben.

Der Code sieht so aus
Delphi-Quellcode:
procedure TMyListView.EvOnItemClickEx( const Sender: TObject;
                                            ItemIndex: Integer;
                                       const LocalClickPos: TPointF;
                                       const ItemObject: TListItemDrawable);
var
  LItemObject : TListItemDrawable;

begin
    if Sender is TListView then
    begin

        LItemObject := ItemObject; //<=== das ist ein TListItemDrawable

        ...
 
        if Assigned( LItemObject ) then
        begin
            if LItemObject is TListItemText then //<=== hier crasht es, bei der Auflösung
            begin
                ...
            end
    ....
end;
dabei ist TListItemText von TListItemDrawable abgeleitet,
also sollte Obiges doch IMMER funktionieren.

Die Auflösung "as" stürzt hier ab (bei InheritsFrom)
Delphi-Quellcode:

function _IsClass(const Child: TObject; Parent: TClass): Boolean;
begin
  Result := (Child <> nil) and Child.InheritsFrom(Parent);
end;


class function TObject.InheritsFrom(AClass: TClass): Boolean;
var
  ClassPtr: Pointer;
  P: Pointer;
begin
  Result := False;
  ClassPtr := Pointer(Self);
  while True do
  begin
    if ClassPtr = Pointer(AClass) then
    begin
      Result := True;
      break;
    end;
    P := PPointer(PByte(ClassPtr) + vmtParent)^; //<=== hier crasht es, schon beim 1. Durchlauf
    if P = nil then break;
    ClassPtr := PPointer(P)^;
  end;
end;
Das Ganze passiert unter iOS, und ich kann die Pointer leider nicht vernünftig debuggen.

Der Aufruf kommt aus dem FMX.ListView, an dieser Stelle
Delphi-Quellcode:
procedure TListViewBase.ProcessIncident(const Entry: TDelayedIncidentEntry);
begin
  case Entry.Incident of
    TDelayedIncident.ChangeRepainted:
      DoChangeRepainted;

    TDelayedIncident.Invalidate:
      Invalidate;

    TDelayedIncident.SetItemIndex:
      SetItemIndexInternal(Entry.CustomData);

    TDelayedIncident.ClickEvent:
      if Assigned(FOnItemClickEx) then
        FOnItemClickEx(Self, FClickEventItemIndex, FClickEventMousePos, FClickEventControl); //<====

....
Die Parameter im ListView sollten doch eigentlich OK sein.
Könnte es was mit dem TDelayedIncident.ClickEvent zu tun haben ?

Bin im Moment ratlos was das sein könnte, vielleicht hat das schon mal jemand gelöst.

Das Ganze hat überigens unter Rx1033 (und vorher) wunderbar funktioniert.

Geändert von Rollo62 (12. Jun 2020 um 16:32 Uhr)
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.896 Beiträge
 
Delphi 12 Athens
 
#2

AW: 10.4: Was kann einen Absturz bei der Auflösung von "MyObject as TType" verursach

  Alt 16. Jun 2020, 10:09
Push Gibt es hier denn gar keine Idee ?

Wie und warum kann das reproduzierbar bei der Auflösung der Typen crashen ?
Kann man das irgendwie besser Testen/Debuggen um zu sehen was los ist ?

Der OnItemClickEx Event müsste doch, wenn Assigned(), immer einen gültigen, auflösbaren Wert enthalten.

Sollte Assigned() das Problem sein, und muss warum auch immer <> nil benutzt werden ?
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.059 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: 10.4: Was kann einen Absturz bei der Auflösung von "MyObject as TType" verursach

  Alt 16. Jun 2020, 11:22
Log dir doch mal den Zeiger von LItemObject raus (mit IntToHex oder dergleichen).
Weil der Zeiger ist ja mit bspw. $1F ggf. assigned, aber es gibt keine gültige Datenstruktur dahinter.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#4

AW: 10.4: Was kann einen Absturz bei der Auflösung von "MyObject as TType" verursach

  Alt 16. Jun 2020, 11:50
Meine Vermutung ist, dass dadurch, dass das Event verzögert ausgeführt wird, in der Zwischenzeit das Objekt, was da übergeben wird, freigegeben wurde - vermutlich ein Bug, der sich beim entfernen von ARC auf iOS eingeschlichen hat - ich sehe, dass FClickEventControl mit [Weak] markiert ist, also unter ARC auf nil gesetzt wurde, wenn das Objekt dahinter freigegeben wurde, aber ohne ARC tut das gar nix. Da wird wohl irgendwo Code fehlen, der das nun auf nil setzt, sollte die Instanz, die dort referenziert werden, freigegeben werden.
Der ItemObject ist natürlich noch assigned/nicht nil, aber wenn du dann etwas damit machen willst (z.b. die Klasse überprüfen) klatscht das gegen die Wand. #danglingpointer
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.896 Beiträge
 
Delphi 12 Athens
 
#5

AW: 10.4: Was kann einen Absturz bei der Auflösung von "MyObject as TType" verursach

  Alt 16. Jun 2020, 12:40
Danke für die Vorschläge.

Ich habe auch das ARC im Verdacht.

Es passiert aber bei OnItemClickEx, und das FClickEventControl Feld wird gesetzt, also müsste das doch noch vorhanden sein.
Es scheint nur auf einer Stelle zu nil werden, da kommt der Debugger aber gar nicht vorbei.
Es wir ja nur durch Click nichts entfernt (normalerweise).

Ich muss mich wohl tiefer durch die iOS-Sourcen arbeiten.

Werde mir den Logger für die Pointer erweitern, gute Idee.

Weil ARC suspect erscheint werde ich das Ganze auch mal unter Android versuchen, statt mich in IOS festzubeissen.
Manchmal springt einem der Fehler dann sofort ins Auge.
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.896 Beiträge
 
Delphi 12 Athens
 
#6

AW: 10.4: Was kann einen Absturz bei der Auflösung von "MyObject as TType" verursach

  Alt 17. Jun 2020, 07:19
Ich habe die Stelle zusätzlich in try except finally verpackt, um das besser testen zu können.

Irgendwie spielt da aber auch immer der Debugger mit rein (unter iOS),
da bekomme ich teilweise ohne das ich irgendwas drücke immer mal Fehlermeldungen wie (sinngemäß)
"out of system resources",
"this current debug session must end before the requested operation can proceed. (terminate, detach, cancel, help)",
"in order to proceed you must close the debugger before",

Edit:
-->
Sowas steht in der Hilfe dazu
Zitat:
Your choices are:

Terminate closes the application that is running in the debugger and returns you to the IDE.
Detach disconnects the debugger from the current (running) program and refocuses on the IDE.
Cancel returns you to the debugger and allows you to terminate your application normally (for example, by selecting Close on the File menu).
Wobei Cancel durchaus normal weiter-debugged.
<--

Edit2:
-->
Ab und zu kommt auch diese Meldung, beim Deployment auf ein iOS Device, beim nächsten Mal geht es
dann wieder, oder auch nicht.
"Installed application lookup failed (attemp 1 of 5 in 5 sec.)"

Nach Löschen der App auf dem Gerät, und Build All geht es dann garantiert auch wieder.

Alle diese seltsamen Dinge habe ich vor 10.4 jedenfalls noch nie gesehen.
<--

Wenn ich die Meldungen wegklicke geht es aber trotzdem noch weiter.

Das Ganze ist dann ziemlich träge, was mich auf Fehler in Richtung LSP bringt.

Könnte es sein das der LSP, der jetzt ja auch im Debug-Mode funktioniert, nicht in einem parallelen Prozess sein Unwesen treibt, sondern auch im aktuellen Debug-Prozess ?`

So fühlt es sich jedenfalls an.

Ich werde mal versuchen CodeInsight ganz abzuschalten, oder auf den alten Mode.

Geändert von Rollo62 (17. Jun 2020 um 09:08 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:58 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz