2008-09-12 29 views
3

Ich entwickle eine Multi-Thread-App für eine Linux-Embedded-Plattform.Messstack-Nutzung für Linux Multi-Thread-App

Momentan setze ich die Stackgröße für jeden Thread (über pthread_set_attr) auf einen ziemlich großen Standardwert. Ich möchte diesen Wert für jeden Thread auf etwas kleiner einstellen, um den Speicherverbrauch meiner Anwendung zu reduzieren. Ich könnte die Trial-and-Error-Route der Festlegung der Stack-Größe jedes Threads auf progressiv kleinere Werte durchlaufen, bis das Programm abgestürzt ist, aber die Anwendung verwendet ~ 15 Threads jeweils mit völlig anderen Funktionen/Attributen, so dass Ansatz wäre sehr zeitaufwendig.

Ich würde lieber lieber in der Lage sein, die Stack-Nutzung jedes Threads direkt zu messen. Gibt es einige Utility-Leute, die dies empfehlen können? (Zum Beispiel, ich komme aus einem vxWorks Hintergrund und mit dem Befehl ‚ti‘ von VxWorks shell direkt Statistiken auf dem Stack-Verbrauch gibt sowie andere nützliche Informationen über den Task-Status.)

Dank

Antwort

3

I kenne keine guten Werkzeuge, sondern als letztes Mittel könnten Sie einen Code in Ihrer Anwendung einbinden, um es zu überprüfen, wie die folgenden:

__thread void* stack_start; 
__thread long stack_max_size = 0L; 

void check_stack_size() { 
    // address of 'nowhere' approximates end of stack 
    char nowhere; 
    void* stack_end = (void*)&nowhere; 
    // may want to double check stack grows downward on your platform 
    long stack_size = (long)stack_start - (long)stack_end; 
    // update max_stack_size for this thread 
    if (stack_size > stack_max_size) 
    stack_max_size = stack_size; 
} 

die check_stack_size() Funktion müßte in einige der Funktionen aufgerufen werden, sind am tiefsten verschachtelt.

Dann als letzte Anweisung im Thread könnten Sie stack_max_size irgendwo ausgeben.

Die stack_start Variable würde beim Start des Threads initialisiert werden:

void thread_proc() { 
    char nowhere; 
    stack_start = (void*)&nowhere; 
    // do stuff including calls to check_stack_size() 
    // in deeply nested functions 
    // output stack_max_size here 
} 
2

Referenzierung Tobis Antwort: Sie pthread_attr_getstackaddr verwenden können, um die Basis des Stapels zu jeder Zeit zu bekommen, wenn eine Variable in Thread Einstellung Initialisierung ist schwierig. Sie können dann die Adresse einer automatischen Variablen in Ihrer eigenen Funktion ermitteln, um festzustellen, wie tief der Stapel in diesem Moment ist.

2

Hier sind zwei Werkzeuge, die (native pthreads) messen Stackverbrauch in Linux-Anwendungen:

Valgrind

Verbrauch:

valgrind --tool=drd --show-stack-usage=yes PROG 

Valgrind ist ein stabiles und leistungsfähiges Werkzeug, das nicht nur zur Messung der Stapelnutzung nützlich ist. Es unterstützt jedoch möglicherweise nicht alle eingebetteten CPU-Modelle.

Stackusage

Usage:

stackusage PROG 

Stackusage ist ein leichtgewichtiges Werkzeug speziell für die Messung von Thread-Stack Nutzung der für die meisten eingebetteten Linux Plattformen tragbar sein sollte mit glibc ausgestattet. Es ist wahrscheinlich nicht so gut getestet oder ausgereift wie Valgrind/drd an dieser Stelle.

Vollständige Offenlegung: Ich bin der Autor von Stackusage.