Frage

In Matlab kann man verwenden dbstack den Call-Stack zum aktuellen Zeitpunkt abgerufen werden, jedoch dbstack ist im Standalone-kompilierten Versionen von Matlab-Programmen nicht verfügbar ist, gibt es eine Alternative den Call-Stack zu bekommen, oder zumindest die Funktion Aufruf die aktuellen Funktion? Ich möchte eine Anlage Funktion schreiben, dass Bedürfnisse zu wissen, von wem es genannt wurde, aber ein vollständiger Call-Stack wäre vorzuzuziehen.

War es hilfreich?

Lösung

Hier ist, wo die Lösungen stehen so weit:

  • Wie Sie erwähnt haben, die Funktion DBSTACK auf der Liste der Funktionen, die von dem MATLAB Compiler nicht unterstützt werden , so dass es nicht verwendet werden kann.
  • Sie auch in einem Kommentar erwähnt, dass, obwohl die Funktion EVALIN ist nicht auf der nicht unterstützten Funktion Liste der Compiler noch werden Sie es nicht zulassen, dass verwenden. Dass am Ende einige der bisherigen Lösungen Ablehnung schlug ich vor.
  • Nachdem Sie Ihr eigenes Stack-Trace zu erhalten, indem Argumente entlang der Kette von Funktionsaufrufen vorbei (oder möglicherweise von ihnen in einem globale Variable ) ist aufgrund der Komplexität und zusätzliche Arbeit keine ideale Option, um es zu halten nehmen würde.

Aber ich habe noch eine mögliche Lösung, dass ich denke, die „saubersten“ ist noch: mit den Fehlerbehandlungsmechanismen bei dem Stack-Trace zu erhalten. Diese variieren je nach der MATLAB-Version Sie verwenden ...

MATLAB-Versionen 7.5 (R2007b) und neue:

Neue Fehlerbehandlungsfunktionen in Form des MException Klasse eingeführt wurden in Version 7.5 . Sie können Informationen über den Stack-Trace von MException erhalten Objekte durch das Erstellen und eine „Dummy“ Ausnahme zu werfen, dann sofort es zu kontrollieren und den Zugriff auf die stack Feld . Wenn Sie die folgende in einer Funktion zu tun:

try
  throw(MException('phony:error',''));
catch ME
  callerStack = {ME.stack.name};
end

Dann wird die Zellenmatrix callerStack die Namen aller Funktionen in dem Call-Stack enthält, mit den aktuellen Funktionsnamen in dem ersten Elemente und der meisten Top-Anrufernamen in dem letzten Elemente.

MATLAB-Versionen 7.1 (R14SP3) bis 7,4 (R2007a):

Für diesen früheren Versionen können Sie die ERROR Funktion einen Fehler und die LetzteFehlerNr Funktion werfen fangen die Fehler und nutzen Sie die Stack-Informationen:

try
  error('phony:error','');
catch
  s = lasterror;
  callerStack = {s.stack.name};
end

MATLAB-Versionen 7.0.4 (R14SP2) und früher:

Leider ist die LetzteFehlerNr nur Funktion gestartet Rückkehr Stack Trace-Informationen in MATLAB Version 7.1 , so gibt es keine Version der oben genannten Lösungen, dass ich mit für frühere MATLAB-Versionen kommen kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top