Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Stacktrace von einem Thread ausgeben
Sebrahi
myCSharp.de - Member



Dabei seit:
Beiträge: 14

Themenstarter:

Stacktrace von einem Thread ausgeben

beantworten | zitieren | melden

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

private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 1821
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Palladin007
myCSharp.de - Member

Avatar #avatar-4140.png


Dabei seit:
Beiträge: 1457
Herkunft: Düsseldorf

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7538
Herkunft: Waidring

beantworten | zitieren | melden

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!"
private Nachricht | Beiträge des Benutzers
Sebrahi
myCSharp.de - Member



Dabei seit:
Beiträge: 14

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7538
Herkunft: Waidring

beantworten | zitieren | melden

Hallo Sebrahi,
Zitat
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!"
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4001

beantworten | zitieren | melden

Zitat von gfoidl
Debugger-Erfahrung
???
Automatische Rechtschreibkorrektur oder Übersetzung? Debugger-Sitzung?



private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7538
Herkunft: Waidring

beantworten | zitieren | melden

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!"
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4001

beantworten | zitieren | melden

Ach so. Ich dachte schon, es handelt sich um ein neues, mir unbekanntes, IT-Fachwort.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Th69 am .
private Nachricht | Beiträge des Benutzers