地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【C】スタック使用量を出力する

perlアプリケーションの負荷テストをやっていて関数ごとのメモリ使用量とかみたいけどどうやって出すんだ。Cなら分かるのにって場面があった。Cなら分かるって思ったはいいもののそういえばどうやって出すんだろって思ってサンプル見ながら実装してみた。

ライブラリで使うスタックサイズなんて決められないよ!って話 - Qiita

#include <stdio.h>
#include <stdib.h>

#define STACK_SIZE (1024 * 1024 * 10) // 10 MB
#define MAGIC_NUMBER 'Z'

static void *function(void *arg);
static void check_stack(char *adr);

int main(void)
{
 char *stack_adr = (char *) malloc(STACK_SIZE);

 for (int i = 0; i < STACK_SIZE; i++) {
  stack_adr[i] = MAGIC_NUMBER;
 }

 pthread_attr_t thread_attr;
 pthread_attr_init(&thread_attr);
 pthread_attr_setstack(&thread_attr, (void *) stack_adr, STACK_SIZE);
 pthread_t thread;
 pthread_create(&thread, &thread_attr, &function, NULL);
 pthread_join(thread, NULL);
 check_stack(stack_adr);
 free(stack_adr)
 return 0;
}

static void *function(void *arg)
{
 char buff[1024 * 100]; // 100KB
 memset(buff, MAGIC_NUMBER + 1, sizeof buff);
 return NULL;
}

static void check_stack(char *adr)
{
 int i;
 for (i = 0; i < STACK_SIZE; i++) {
  if (adr[i] != MAGIC_NUMBER) {
   break;
  }
 }
 printf("Used %d byte\n", STACK_SIZE - i);
}