debugger の使い方
Menuwrite を引数二つで指定した回数m * n だけ行うプログラムを C で作成せよ。(hint atol を用いる ) 出力は空白または0を使う。
n 回出力する関数 f f をm 回呼び出す関数 gこれを main から呼び出す。
lldb と gdb 両方で以下の操作を行い、log を示せ
(1) 作成したプログラム 引数 n=100, m=200 を指定して、lldb/gdb を起動する。プログラムは -O0 -g で compile すること。
(2) 関数 f のwriteを呼び出しているところ break point を設定し、そこで止める。
(3) frame up を使って main 関数で、m と n に正しい値が格納されていることを示せ
(4) break point を学籍番号の下位二桁の回数だけ通過してから、break point で止まるようにせよ
lldb brea modiy -i xx gdb ingore xx yy ?(5) m の値が指定した値で停まるようにせよ
(6) write する直前停めた時に disass して assembler を見る。stepi を繰り返して、sycall の直前までいく
(7) 実際に write system call が呼ばれる直前の register の値を示せ
lldb regisgter read gdb info register(8) break point を解除し、 f が終了するように finish コマンドを使う
option
m と n の値を変更することが可能かどうかを調べて試してみよ。f と g は、clang/gcc の最適化によって、どのような assembler になるかを調べよ。
最適化されたコードを assembler level で trace してみよう。
cmake
nm.c を作るCMakeList.txt を作る
project( nm ) add_definitions("-Wall") add_executable( nm nm.c )この段階で hg init ; hg add ; hg commit する
% cmake -DCMAKE_BUILD_TYPE=Debug .で debug build する
% make % lldb -- ./nm 10 20