Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Threads Überwachen / CallStack (https://www.delphipraxis.net/99892-threads-ueberwachen-callstack.html)

Gruber_Hans_12345 19. Sep 2007 09:59


Threads Überwachen / CallStack
 
Hallo

Ich habe eine Anwendung, die auf einem Server ganz normal im Hintergrund läuft (tut im prinzip nix anderes als alle 15 minuten große berechnungen durchzuführen - oder wenn per TCP/IP Anfragen daherkommen, auch neu zu berechnen)
jetzt habe ich das phänomen, das ab und zu die Anwenung 100% CPU Leistung benötigt ... was natürlich nicht so nett ist (es wird auch nichts mehr berechnet)

da hab ich folgende idee
ich schreib mir einen thread, der in intervallen alle anderen threads überwacht, und wenn ein thread der anwendung zu viel cpu zeit oder so konsumiert hat, dann soll der den callstack dieses threads ausgeben ... und je nach einstellung nach gewisser zeit vielleicht, die anwendung neu starten.

hat da jemand vielleicht gute ideen dazu?

vorallem wie kann man erkennen, das ein thread nicht mehr gut läuft? ich möchte vermeiden, einen art watchdog einzubauen, wo der thread immer wieder mal bescheid sagt, das er noch ok ist - die CPU Zeit was so ein thread hat kann man ja niergends auslesen oder? (geht ja nur für prozese?)

hat da wer ne idee dazu?

[edit]dachte mir hab hie irgendwo mal gelesen, man bekommt die CPU Zeit pro Thread nicht raus ... aber das scheint mit GetThreadTimes ja ohne probleme zu gehen ... [/edit]

Gruber_Hans_12345 19. Sep 2007 11:09

Re: Threads Überwachen / CallStack
 
Also hab im moment das problemchen, das ich nicht an den callstack eines thread rankomme

hat da wer infos dazu?

ich habe einen überwachungsthread, der geht alle thread des prozesses durch, und soll mir für diese den callstack ausgeben (JCL Debug Infos sind drinnen)
aber die "normale" funktionen für den callstack greifen ja auf die CPU Register EBP und so zu, die bekomm ich dann natürlich immer nur für den aktuellen Thread (den Überwachungsthread)

HERMES 19. Sep 2007 11:19

Re: Threads Überwachen / CallStack
 
Warum lässt du die Threads aktiv obwohl du sie momentan nicht benötigst? Wenn du damit irgendwelche Dinge pollst ohne Unterbrachung bekommst du natürlich eine hohe CPU Auslastung.

Ansonsten solltest du nicht benötighte Threads suspenden oder gleich löschen.

mfg

Gruber_Hans_12345 19. Sep 2007 12:14

Re: Threads Überwachen / CallStack
 
Zitat:

Zitat von HERMES
Warum lässt du die Threads aktiv obwohl du sie momentan nicht benötigst? Wenn du damit irgendwelche Dinge pollst ohne Unterbrachung bekommst du natürlich eine hohe CPU Auslastung.

Ansonsten solltest du nicht benötighte Threads suspenden oder gleich löschen.

mfg

darum geht es nicht

die haben im normal fall keine hohe auslastung, nur wenn die was zu tun haben

und threads brauche ich, da es sich hier um blockierende sachen handelt (blockierende TCP/IP Verbindungen und blockierende COM Verbindungen) und solche sachen kann man nur mit threads lösen - die kann man weder löschen noch in suspend schicken, da die ja auf daten warten sollen ;)

und für den fall, das so ein thread dann aus gründe welche auch immer beim abarbeiten dann in ne endlosschleife oder in eine beinahe endlosschleife kommen, möchte ich gernen den callstack dieses einen threads auslesen - aber wie gesagt da ja der stack im EBP register abgelegt ist, tu ich mir schwer, bräuchte irgendwie die infos, wie ich den Stack eines nicht aktuellen Threads auslesen kann

HERMES 19. Sep 2007 15:00

Re: Threads Überwachen / CallStack
 
Ich dachte dabei an Arbeitsthreads, klar bei Threads zur kommunikation geht das so nicht, allerdings sollten diese ja eigentlich keine hohe Last erzeugen, wenn diese sich in einem geblockten zustand, durch die kommunikation, sind. Wenn du allerdings deine Kommunikationspuffer pollst ohne pause kann schon eine hohe auslastung entstehen.

Gruber_Hans_12345 19. Sep 2007 15:10

Re: Threads Überwachen / CallStack
 
Zitat:

Zitat von HERMES
Ich dachte dabei an Arbeitsthreads, klar bei Threads zur kommunikation geht das so nicht, allerdings sollten diese ja eigentlich keine hohe Last erzeugen, wenn diese sich in einem geblockten zustand, durch die kommunikation, sind. Wenn du allerdings deine Kommunikationspuffer pollst ohne pause kann schon eine hohe auslastung entstehen.

Wir reden hier anscheinend ziemlich aneinander vorbei ...

das ist mir schon alles klar

ich will ja, wenn ich solch einen thread entdecke, diesen einen thread ausfindig machen

das problem, ist normalerweise funkt alles ohne probleme, nur durch irgendwelche zustände kann es anscheinend passieren, das ein thread irgendwo eine endlosschleife macht.

und genau in so einem fall will ich den CallStack des Threads auslesen - macht der thread ne exxception

darum geht es mir : den CallStack eine Threads auslesen, ich brauche irgendwie die informationen, wie ich den aktuellen Stackpointer, der normalerweise im EBP Register ist, auslesen kann, wenn ich mich gerade in einem anderen Thread befinde

es geht hier NICHT darum wie die Thread organisiert sind, ob die pollen oder nicht oder sonst was - auch nicht wie der kommunikationspuffer organisiert ist, sondern darum einen Thread, der nicht mehr richtig reagiert rauszufinden in welche(n) funktionen der gerade ist, damit mir das fehlersuchen leichter fällt


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