Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Function to be called, ... was eliminated by linker (https://www.delphipraxis.net/211032-function-called-eliminated-linker.html)

Maliko 18. Jul 2022 12:11

Function to be called, ... was eliminated by linker
 
Hoy,

ich hab mal ne Frage an euch. Und zwar hab ich das Problem dass ich hier eine TList habe, in diese über Strg+F7 aber nicht reinschauen kann. Wenn ich versuche List[0] aufzurufen bekomme ich folgende Fehlermeldung zurück:

Zitat:

Function to be called, {System.Generics.Collections}TList<uASDateUtils.TD ateRange>.GetItem, was eliminated by linker
Es funktioniert aber ohne Probleme. Ich kann problemlos durch die Liste iterieren und die Werte auch in anderen Variablen speichern. Ich kann nur nicht im Debugger reinschauen.
Gibt es irgendeine Möglichkeit das abzuschalten, dass der Linker .GetItem eliminiert weil GetItem als inline gekennzeichnet ist?

Vielen Dank schon mal im Voraus.

Viele Grüße
Maliko

jaenicke 18. Jul 2022 12:18

AW: Function to be called, ... was eliminated by linker
 
Ich habe es nicht getestet, aber wenn du an einer Stelle {$INLINE OFF} verwendest, an der du darauf zugreifst, sollte der Compiler den Aufruf nicht inline umsetzen und somit die Funktion zur Verfügung stehen.

himitsu 18. Jul 2022 12:18

AW: Function to be called, ... was eliminated by linker
 
An der Stelle, wo dein Debugger sich grade befindet, ist die gewünschte Funktion nicht verfügbar, z.B. weil sie "dort" garnicht verwendet wurde, weswegen der Compiler dort die nötigen Funktionen+Debuginos nicht eingebunden hat.

Lösung: Die Funktion, welche man im Debugger braucht, auch im Code aufrufen.

Und sei es innerhalb eines IF-THEH, was zur Laufzeit mit False übersprungen wird.
kein
Delphi-Quellcode:
if False then
, welches der Compiler direkt auflöst und wo er dann den Inhalt nach dem THEN weglassen kann, weil es ja "niemals" genutzt werden würde.




In deinem Fall wird über das Inline diese Funktion ja "weggelassen" und stattdessen direkt der Funktionsinhalt eingebunden.
Daher ist diese Funktion auch nicht im Code und kann auch nicht vom Debugger genutzt werden.

Zitat:

Es funktioniert aber ohne Probleme
Klar, der Code innerhalb dieser Funktion ist ja da, nur liegt er eben nicht in dieser Funktion, weil Diese ja weggelassen werden sollte. (inline)


[edit] Wie schon gesagt wurde, das Inline deaktivieren.
Alternativ oben die Unit weglassen, die für das was in der Funktion drin ist, damit das Inline nicht ausgeführt werden kann.

Maliko 18. Jul 2022 12:40

AW: Function to be called, ... was eliminated by linker
 
Vielleicht kannst du mir da genauer weiterhelfen, da ich zugeben muss, das ich deine Antwort nicht ganz verstehe. Das ist mein Aufruf.

Delphi-Quellcode:
Variables.TryGetValue('fakturavon', mVon);
Variables.TryGetValue('fakturabis', mBis);
FDictFaktura := TASDateUtils.SplitDateRange(mVon, mBis);
Wenn ich jetzt versuche in FDictFaktura reinzuschauen, dann bekomme ich den Fehler. Rufe ich die Funktion im Debugger direkt auf, dann funktioniert es (was aber scheiße ist, da ja jedes mal die Funktion gecalled wird, was bedeutet, das jedes mal unter umständen dann auch ein DB-Query abgeschossen wird, nur weil man in die entsprechenden Indizes sehen möchte.

himitsu 18. Jul 2022 14:05

AW: Function to be called, ... was eliminated by linker
 
Zitat:

Delphi-Quellcode:
type
  TList<T> = class(TEnumerable<T>)
    ...
    function GetItem(Index: Integer): T; inline;
    ...
  end;

function TList<T>.GetItem(Index: Integer): T;
begin
  // CheckItemRange(Index) is expanded here manually to improve codegen
  if Cardinal(Index) >= Cardinal(FCount) then
    ErrorArgumentOutOfRange;
  Result := List[Index];
end;

Getitem, bzw. Item kannst du im Debugger nicht benutzen, weil es Dieses "nicht" als Funktion gibt, da durch INLINE weboptimiert.

geht nicht:
Delphi-Quellcode:
xxx[i]
oder
Delphi-Quellcode:
xxx.Item[i]


würde gehen:
Delphi-Quellcode:
xxx.List[i]



Ja, für Debugging ist dieses INLINE hier echt blöd.
Könntest also das Inline also deaktivieren, oder alternative Funktionen nutzen, welche es "gibt".

Delphi-Quellcode:
{$INLINE OFF}
, bzw. in den Projektoptionen.
https://docwiki.embarcadero.com/RADS...line_Directive


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:41 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