Makro zur Anzeige des aktuellen "Include" und der aktuellen Function

  • Noch eine Frage zur optischen Aufbereitung der Ausgaben in der Console zum Debuggen:

    Gibt es neben @ScriptName eine Möglichkeit, anzuzeigen in welchem Include und in welcher Function sich das Programm gerade befindet? Sollte in der Console dann so aussehen:

    Mit @ScriptName bekomme ich ja nur den Namen des Scripts, aber nicht, in welchem Bereich ich mich gerade befinde. Workaround für die Function() wäre als erste Zeile in jeder Function "$sFuncName=NameDerFunktion" zu setzen. Genauso könnte man dahinter noch "$sIncludeName=NameInclude.au3" setzen.

    Aber vielleicht gibt es ja eine bessere Möglichkeit?

    :)

    • Offizieller Beitrag

    anzuzeigen in welchem Include und in welcher Function sich das Programm gerade befindet?

    Für AutoIt ist mir da nichts Natives bekannt.

    Du suchst sowas, wie in Lua:

    Code
    local ct = require 'CommonTools'  -- ein Include
    
    local callme = function() -- nur Debugzeile
        print(string.format('%s\t|\t%s\t(%d)', debug.getinfo(1).short_src, debug.getinfo(1,"n").name, debug.getinfo(2).currentline))
    end
    
    
    callme() -- Aufruf aus aktueller Datei "debug_test.lua"
    
    ct:OSTime()  -- Aufruf der includierten Funktion des Includes "CommonTools.lua" (enthält identische Debugzeile)

    OUTPUT:

    Code
    C:\CODE\Lua\debug_test.lua     |    callme    (8)
    C:\Code\Lua\CommonTools.lua    |    OSTime    (10)

    Die Debug-Bibliothek muss in der Programmsource (nicht im Skript) verankert sein. Sowas ist wohl leider für AutoIt nie entwickelt worden.

    Um da mittels Skript zuzugreifen müsste man wohl so einiges im Ablauf umleiten und verbiegen. Ist wohl auch einer der Gründe, warum sich bisher keine Debug-UDF wirklich etablieren konnte.

  • Schade, aber danke - dann muss ich nicht weiter suchen.

    Als Workaround ist natürlich möglich, dass ich in jeder Function() stattdessen $sFuncName="xxx" und $sInclude="yyy" vorne deklariere.

    Um die Funktionen nicht zu sehr aufzublähen, ist es irgendwie möglich, 2 Befehle in eine Zeile zuschreiben?

    Oder anderer Workaround: Func _Umgebung($sFuncName, $sInclude) und dann in jeder Function die Function als erstes aufrufen.

    Oder noch eine Idee: bei irgendwelchen alten Programmiersprachen (Fortran, Cobol?), die ich mal vor vielen Jahren gelernt habe, konnte man irgendwelche Variablen für die Kompilierung definieren, die als erstes in einem Precompile einfach ersetzt wurden. Also oben $$Include="xxx" und unten im Programm wurden dann alle $$Include vor dem Compile durch "xxx" ersetzt.

    :)

    Einmal editiert, zuletzt von HansJ54 (7. Juni 2021 um 13:04)

  • So?

  • Du hast Recht. Ohne das "After" könnte man nach Beenden z.B. von verschachtelten Funktionen nicht wissen, wohin und ab wo man zurückgekommen ist. Wobei natürlich dann die Zeilennummern helfen könnten, wenn man nicht gerade zwischen 2 Includes hin- und her gesprungen ist.

    Allerdings auch schwierig, wenn es innerhalb einer Funktion an mehreren Stellen Returns gibt. Dazu müsste man die Werte dann in einen Stack schreiben. Mit jedem Function-Call was obendrauf und jedem Return wieder weg.

    Das wäre dann wohl ein "Feature Request" für AutoIt (mit wenig Chancen zur Verwirklichung) ;)

    :)

  • Eigentlich habe ich die Before/After ConsolewWrites nur eingefügt um zu zeigen, dass der Code genaus das macht, was gewünscht ist.
    Mein Beispiel benötigt keinen Stack. Die Variablen $sFuncName und $sInclude gelten durch ihren Local Scope nur in der jeweiligen Funktion.

    Nach Rückkehr zur aufrufenden Funktion sind wir wieder im Scope der aufrufenden Funktion und daher eine Ebene höher.

    Das funktioniert sogar, wenn die Variablen im Main Script denselben Namen haben.

    Was ohne Stack nicht geht: In der aufgerufenen Funktion erfahren, woher sie aufgerufen wurde.

  • Du hast Recht, durch das "Local" werden die Variablen ja im Prinzip schon gestackt. Und durch das "Local" kann man beide Werte platzsparend in nur eine Zeile schreiben. Das ging bei mir nicht, weil ich die Variablen außerhalb als "Global" deklariert hatte.

    Das "called from" hatte ich schon mal mit einer eigenen Function() implementiert, brauche ich aber zum Debuggen eigentlich nicht. Mit "Local" statt "Global" komme ich super hin. Danke!

    :)

  • :)

    • Offizieller Beitrag

    Vielleicht ist der Ansatz zum Abfragen von Funktionsname und Zeile des Aufrufs für dich interessant.