Laden...

Stacktrace von einem Thread ausgeben

Erstellt von Sebrahi vor 2 Jahren Letzter Beitrag vor 2 Jahren 369 Views
S
Sebrahi Themenstarter:in
22 Beiträge seit 2020
vor 2 Jahren
Stacktrace von einem Thread ausgeben

Bei einer Exception kann man ja die Zeile herausfinden wo die Exception aufgetren ist mit :


int line = (new StackTrace(ex, true)).GetFrame(0).GetFileLineNumber();

Analog möchte ich ohne das eine Exception auftrifft, außerhalb eines Threads, die Aktuell ausgeführten Code ausgeben.
Ist das möglich mit Thread oder anderweitig?


      Thread myThread = new Thread(ThreadMethod);           
      myThread.Start();            
      myThread.GetLineOfCurrentlyExecutedCode();// Dies möchte ich realisieren

T
2.219 Beiträge seit 2008
vor 2 Jahren

Was du vorhast, ist so nicht vorgesehen und auch nicht wirklich sinnvoll.
Eigentlich gibt es keinen mir bekannten Anwendungsfall, in dem ein Thread den Code, den er gerade ausführt, ausgeben soll.
Was ist den der Zweck des Ganzen?
Einen wirklich sinnvollen Grund kann ich mir leider nicht vorstellen.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

2.078 Beiträge seit 2012
vor 2 Jahren

Man könnte sich mit den Caller Information Attributes behelfen, da generiert der Compiler die Daten, die Du haben willst.
Das müsste man dann aber bei jeder Methode nutzen und mitschreiben und irgendwann kommt man auch bei einem Punkt an, wo man einfach keine Methoden mehr aufruft, also funktioniert das auch nicht mehr.

Aber ich stimme T-Virus zu: Das klingt nicht sehr sinnvoll.
Vermutlich willst Du über umwege etwas erreichen, was Anders viel besser geht?

6.911 Beiträge seit 2009
vor 2 Jahren

Hallo Sebrahi,

eine direkte Unterstützung für dein Vorhaben gibt es in .NET nicht*.
Das "Stack walking" ist aber ein Runtime-Feature, das intern oft verwendet wird. Nicht nur bei Fehlern, sondern v.a. während einer Garbage Collection um "Roots" in Form von lokalen Variablen (die auf dem Stack liegen) zu finden.

Wenn du nun die Stack-Information eines anderen Threads (wirklich) während der Programmausführung benötigst, so würde ich das via Debugger-/Profiler-APIs machen da es dort Zugriff auf die Stacks gibt. Aber recht trivial ist das nicht.

Sollte der Code im Thread unter deiner Kontrolle sein, so kannst du dort ja via Event, Callback etc. den StackTrace generieren lassen mittels


StackTrace stackTrace = new(fNeedFileInfo: true);   // vom jeweils aktuellen Thread
Console.WriteLine(stackTrace);

Als Textrepräsentation gibt es auch Environment.StackTrace vllt. reicht dir diese Info schon aus? Wenn die Debug-Symbole (*.pdb) vorhanden sind, so werden auch die Zeilennummern angezeigt.
Übrigens gibt es dafür für .NET Core eine nette neue Projekteinstellung um die Debug-Symbole direkt in die Assembly einzubetten, so dass diese immer vorhanden sein und kein Symbol-Server benötigt wird:


<PropertyGroup>
    <DebugType>embedded</DebugType>
</PropertyGroup>

Gehts hingegen eher um "post mortem" Analysen, so können Heapdumps mit Debuggern (bzw. Erweiterungen) wie SOS diese Information liefern.

* früher gab es noch die Überladung new StackTrace(thread, ...)

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

S
Sebrahi Themenstarter:in
22 Beiträge seit 2020
vor 2 Jahren

Vielen Dank für euere Antworten.
Bzgl. der Frage was der Zweck des Ganzen ist.
Bei den Threads in meinem Programm die lange laufen, kommt es mal vor, dass ich nach ein Paar tagen merke,
dass ein Thread nicht das tut was es soll. Um zu schauen wo der Thread hängt um den Fehler zu beheben wäre es für mich sehr sinnvoll zu wissen wo es hängt.
Also wo der Thread gerade etwas ausführt.

6.911 Beiträge seit 2009
vor 2 Jahren

Hallo Sebrahi,

Um zu schauen wo der Thread hängt um den Fehler zu beheben wäre es für mich sehr sinnvoll zu wissen wo es hängt.

Da rate ich dir zu Dump files in the Visual Studio debugger.
Erstell also einen Dump (kann auch automatisch erfolgen) und analysiere diesen. Einfach gehts mit Visual Studio. Dort den Dump öffnen und du bekommst eine Debugger-Erfahrung. Kannst dir also die Threads inkl. Stack ansehen, Variablen-Werte, etc.

Weniger einfach, dafür aber mit mehr Möglichkeiten, gehts mit WinDbg und SOS-Erweiterung. Aber VS tut es i.d.R. auch.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

4.931 Beiträge seit 2008
vor 2 Jahren

Debugger-Erfahrung ???
Automatische Rechtschreibkorrektur oder Übersetzung? Debugger-Sitzung?

6.911 Beiträge seit 2009
vor 2 Jahren

Hallo Th69,

du hast die Möglichkeit eines unglücklich gewählten Ausdrucks vergessen 😉

Gemeint ist damit, dass in VS der Debugger ähnliche Möglichkeiten wie beim F5-Debuggen bietet. Nur die tatsächliche Ausführung vom Code findet nicht statt (wie auch).
Also wenn jemand Erfahrung mit dem VS-Debugger hat, so bietet sich hier eine ähnliche Erfahrung an.

(Kann gut sein, dass heute mein Deutsch nicht recht besonders ist)

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

4.931 Beiträge seit 2008
vor 2 Jahren

Ach so. Ich dachte schon, es handelt sich um ein neues, mir unbekanntes, IT-Fachwort. 🙂