6

Linux 組み込みプラットフォーム用のマルチスレッド アプリを開発しています。

現時点では、(pthread_set_attr を使用して) 各スレッドのスタック サイズをかなり大きなデフォルト値に設定しています。アプリケーションのメモリ使用量を減らすために、各スレッドの値をより小さな値に微調整したいと考えています。プログラムがクラッシュするまで、各スレッドのスタック サイズを徐々に小さい値に設定するという試行錯誤のルートをたどることができますが、アプリケーションはそれぞれ完全に異なる機能/属性を持つ最大 15 個のスレッドを使用するため、そのアプローチには非常に時間がかかります。

むしろ、各スレッドのスタック使用量を直接測定できることを望んでいます。これを行うために人々が推奨できるユーティリティはありますか? (たとえば、私は vxWorks のバックグラウンドを持っており、vxWorks シェルから「ti」コマンドを使用すると、スタックの使用状況に関する統計情報や、タスク ステータスに関するその他の有用な情報が直接得られます。)

ありがとう

4

3 に答える 3

6

Linux アプリケーションで (ネイティブ pthreads) スタック使用量を測定する 2 つのツールを次に示します。

ヴァルグラインド

使用法:

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

Valgrind は安定した強力なツールであり、スタックの使用状況を測定するだけでなく便利です。ただし、すべての組み込み CPU モデルをサポートしているわけではありません。

スタック使用量

使用法:

stackusage PROG

Stackusage は、スレッド スタックの使用状況を測定するために特別に設計された軽量ツールで、glibc を搭載したほとんどの組み込み Linux プラットフォームに移植できます。現時点では、Valgrind/drd ほど十分にテストされておらず、成熟していない可能性があります。

完全な開示: 私は Stackusage の作成者です。

于 2015-03-04T13:44:23.380 に答える
4

私は良いツールを知りませんが、最後の手段として、次のようなコードをアプリケーションに組み込んでチェックすることができます:

__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;
}

check_stack_size() 関数は、最も深くネストされた関数の一部で呼び出す必要があります。

次に、スレッドの最後のステートメントとして、stack_max_size をどこかに出力できます。

stack_start 変数は、スレッドの開始時に初期化する必要があります。

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
}
于 2008-09-12T10:30:09.260 に答える
3

トビの答えを参照する:pthread_attr_getstackaddrスレッドの初期化時に変数を設定することが難しい場合は、いつでもスタックのベースを取得するために使用できます。次に、独自の関数で自動変数のアドレスを取得して、その時点でのスタックの深さを判断できます。

于 2008-09-12T13:38:25.050 に答える