avstack.pl である程度できる。
avstack.pl の $objdump を適当にアーキテクチャをあわせて変えておく。
my $objdump = "arm-none-eabi-objdump";
このうえで、GCC のコンパイルフラグに -fstack-usage をつける。そうすると .o の同じ名前で .su というファイルができる。
asm から変換されたファイルとかでは .su は作られないので、.su がない .o を除外して、avstack.pl の引数にすべて与える。
$ ./avstack.pl build/obj/Font5x7.o build/obj/adc.o ... Func Cost Frame Height ------------------------------------------------------------------------ > Thread1 792 20 16 sweep 772 84 15 ui_process 688 12 14 ui_process_touch 676 12 13 touch_pickup_marker 664 52 12 drag_marker 612 44 11 ui_process_lever 608 12 12 ui_process_normal 596 28 11 > menu_marker_sel_cb 580 12 11 ...
すると、使用率順に表示してくれる。> マークはどこからもそれが呼ばれていない関数、つまり呼び出し元と思われるもの。
Cost は最大スタック利用量。Frame は該当関数のスタック利用量 (コールコストを含む)。Height は最大コールスタック数。
Height * コールコストが意外とでかい。