i117 プログラミング演習ii i117 programming ii ...shinoda- · 6. 2011/06/23(thu):...
TRANSCRIPT
I117 プログラミング演習II I117 PROGRAMMING PRACTICE II ソフトウェア開発環境1 SOFTWARE DEVELOPMENT ENV. 1 情報社会基盤研究センター Research Center for Advanced Computing Infrastructure (RCACI)
小原 泰弘 / Yasuhiro Ohara
スケジュール / SCHEDULE
1. 2011/06/07(Tue): プログラミングの基礎 / Basic of Programming
2. 2011/06/09(Thu): 基本データ構造 / Fundamental data structures
3. 2011/06/14(Tue): メモリ管理1 / Memory Management 1
4. 2011/06/16(Thu): メモリ管理2 / Memory Management 2
5. 2011/06/21(Tue): デバッグ / Debugging
6. 2011/06/23(Thu): ソフトウェア開発環境1 / Software Development Env. 1
7. 2011/06/28(Tue): ソフトウェア開発環境2 / Software Development Env. 2
8. 2011/06/30(Thu): 木 / Data Structure : Tree
9. 2011/07/05(Tue): ハッシュ / Data Structure: Hash
10. 2011/07/07(Thu): プログラム理解1 / Understanding Programs 1
11. 2011/07/12(Tue): プログラム理解2 / Understanding Programs 2
12. 2011/07/14(Thu): スクリプト言語1 / Script Language 1
13. 2011/07/19(Tue): スクリプト言語2 / Script Language 2
14. 2011/07/21(Thu): その他の言語 / Other Languages
15. 2011/07/26(Tue): 試験 / Examination
課題(自由課題) / FINAL REPORT
自由課題 free topic
テーマ提出: decide topic by 7/5(Tue) report us of the topic by e-mail: [email protected]
例) サウンドファイルの変換プログラム / Sound file converter ウェブクローラー / web crawler カレンダープログラム(CalDAVコマンド群) calendar program 新しいシェル・エディタ・ウィンドウマネージャー new shell, editor, window
manager 圧縮解凍・暗号化アルゴリズム、rsyncの実装 encrypt/decrypt, rsync 形態素解析を利用した人工無能プログラム markov-chain program
良いテーマ・悪いテーマがある choose good theme 教員やTAが相談に乗ります。ask TA and me
レポートには高度な考察・議論を。The final report must have deep consideration
今日の目次 / TODAY'S INDEX
デバッグ / dubugging デバッグ手法 / debugging method
printf デバッグ / printf debug
デバッガ / debugger メモリチェッカ / memory checker
デバッグ手法 / DEBUGGING METHOD
PRINTFデバッグ / PRINTF DEBUG
プログラムの状態を画面に表示して行うデバッグ / print inside states of the program to debug C言語ではprintf関数を使って表示 / use printf printf関数のない他の言語でも,慣習的にこう呼ばれる / called "printf
debug" even in languages other than C 利点 / pros
簡単 / simple デバッガがアタッチできない状況でも使える / can be used when debugger
cannot be used 欠点 / cons
printf関数呼び出しのオーバーヘッドが,プログラム動作に影響を与える可能性がある / printf function can affect results
printf関数をはさむと正しく動くが,はさまないと正しく動かなかったり,その逆の場合もあったりする / situation such as it works with printf and doesn't without printf
マルチスレッドプログラムやデバイスドライバなどでよく起きる / happens in multithread programs and device drivers
printf関数を変更するためにコンパイルが必要 / you have to (be able to) compile the program
大規模なプログラムになると,コンパイルに大きな時間がかかる / compilation takes time
バグのあるプログラム / A PROGRAM WITH BUG 以下のフィボナッチ数を求める関数にはバグが有る /
the function has some bugs int fibonacci(int n) { int num1 = 0; int num2 = 1; int tmp;
int i; for (i = 0; i < n; i++) { tmp = num2; num1 = num2; num2 += tmp; }
return num1; }
フィボナッチ数の定義: The definition of fibonacci numbers: F0 = 0, F1 = 1 Fn+2 = Fn + Fn+1
各ステップの状態を表示 PRINTS EACH STEPS
printf関数を挟んだ例 / an example with printf int fibonacci(int n) { int num1 = 0; int num2 = 1; int tmp; int i; for (i = 0; i < n; i++) { tmp = num2; printf(“tmp = %d\n”, tmp); num1 = num2; printf(“num1 = %d\n”, num1);
printf(“num2 = %d + %d\n”, num2, tmp); num2 += tmp; printf(“num2 = %d\n\n”, num2); }
return num1; }
PRINTFデバッグの出力 / OUTPUTS
fibonacci(1)と呼び出した場合: results of fibonacci(1)
怪しい箇所が2箇所ほど見つかった / two parts seem incorrect
tmp = 1 /* F0 = 0 となるはずであり,おかしい(incorrect) */ num1 = 1 /* F1 = 1 なので正しい(correct) */ num2 = 1 + 1 /* F2 = F0 + F1 = 0 + 1 であり,おかしい(incorrect)*/ num2 = 2 /* F2 = 1 となるはずであり,おかしい(incorrect) */
for (i = 0; i < n; i++) { tmp = num1; /* tmp = num2; が誤りと判明 / bug fixed */ num1 = num2; num2 += tmp; }
マクロ・プリプロセッサの利用 / USE OF PREPROCESSOR 修正後はソースコードからprintfを除く必要がある / cumbersome to
remove printfs いちいち消すのは面倒くさい / must remove all... 消したあとに,また同じことを表示したくなることもある / sometimes
necessary to revive the printf DEBUGマクロが定義されていれば,printfが呼び出されるようにすると良い / use of DEBUG macro int fibonacci(int n) { int num1 = 0, num2 = 1, tmp, i;
for (i = 0; i < n; i++) { #ifdef DEBUG printf(“num1 = %d, num2 = %d\n”, num1, num2); #endif
tmp = num2, num1 = num2, num2 += tmp; } return num1; }
DEBUGを有効化して呼び出し / WITH "DEBUG"
#define DEBUGをソースコード中に定義 /define in program
コンパイルオプションで-DDEBUGと指定 / define in compilation
以下の二つのコマンドを実行すると,どのように表示されるか? / see the difference
#define DEBUG int fibonacci(int n) { ... }
$ ls fib.c $ cc –DDEBUG fib.c
$ cc –DDEBUG –E fib.c $ cc –E fib.c
マクロ・プリプロセッサの利用(中級編) / USE OF MACRO, PREPROCESSOR
DEBUGマクロが定義されていた場合のみprintfが実行されるマクロを定義 / define a macro that runs printf only when "DEBUG" is defined.
マクロの利用 / usage
#ifdef DEBUG #define D(X) printf X #else #define D(X) #endif
D((“num1 = %d\n”, num1)); /* (())と二重にすることに注意 */
大量にログが出力されるときの対処 / WHEN LOTS OF LOGS ARE PRINTED ...
tee コマンドを使った画面とファイル両方への出力 / output both to the display and to a file
リダイレクトによるファイルのみへの出力 / only to a file
$ ./a.out | tee output.txt
$ ./a.out > output.txt
デバッガ / DEBUGGER
DBXを用いたデバッグ / DEBUG USING DBX
dbxとは / what is dbx Unixベースのソースレベルデバッガ / source level
debugger Sunコンパイラに標準で付属 / attached in Sun compiler C, C++, Java, Fortran 77, Fortran 99のデバッグが可能
可能なこと / what can be done 行単位の実行 / step runs for each line 関数呼び出しのトレース / trace of function call ブレークポイントの設定 / set a break point 変数の表示,代入 / display and set a variable レジスタ変数の表示 / display a register メモリ内容の表示 / display contents of memory etc...
デバッグ情報の付加とDBXの起動
-gオプションを用いて,デバッガ情報を付加したコンパイルを行う / with –g option, debugging info is attached in the executable file
デバッガに実行ファイルを読み込み,デバッガを起動 / run the debugger with the executable
各種コマンドのヘルプを表示 / display help
$ cc –g sample.c
$ dbx ./a.out a.out の読み込み中 ld.so.1 の読み込み中 libc.so.1 の読み込み中
(dbx) help # すべてのコマンドを表示 ... (dbx) help stop # stopコマンドのヘルプを表示 ...
対象ソースコード / EXAMPLE
fib.c and fibmain.c
fib.c
1 int fibonacci(int n) 2 { 3 int num1 = 0, num2 = 1; 4 int tmp, i; 5 6 for (i = 0; i < n; i++) 7 { 8 tmp = num1; 9 num1 = num2; 10 num2 += tmp; 11 } 12 13 return num1; 14 }
fibmain.c
1 #include <stdio.h> 2 3 extern int fibonacci(int n); 4 5 void main(void) 6 { 7 int f10 = fibonacci(10); 8 printf(“F(10) = %d\n”, 9 f10); 10 }
NUM1, NUM2変数の表示 / DISPLAY VARIABLE
コンパイルとdbxの起動 / compile, start dbx
fib.cの9行目でプログラムが停止するように設定 set a break point
プログラムを実行 / run the program on the debugger
変数 num1, num2 の表示 / print variables
$ cc –g -c fib.c $ cc –g fib.o fibmain.c $ dbx a.out
(dbx) stop at fib.c:9 (2) stop at “fib.c”:9
(dbx) run ... stopped in fibonacci 行位置: 9 ファイル “fib.c” 9 num1 = num2;
(dbx) print num1, num2 num1 = 0 num2 = 1
ステップ実行と変数への代入 / STEP RUNS AND ASSIGNMENT
1行実行し,変数を表示 execute for a single line
問題: 1行実行するコマンドには,next (ステップオーバー)とstep (ステップイン)があるが,この2つの違いは何か? / what's the difference in "next" and "step" ?
num1 に初期値の0を代入してみる / assign a value
(dbx) next stoopped in fibonacci 行位置: 6 ファイル “fib.c” 6 for (i = 0; i < n; i++) (dbx) print num1, num2 num1 = 1 num2 = 1
(dbx) assign num1 = 0 (dbx) print num1 num1 = 0
関数の呼び出し履歴の表示とフレームの移動 / PRINT CALL STACK AND CHANGE FRAME
呼出履歴の表示と,プログラムカウンタの表示 / display call stack and print a register called "program counter"
呼び出し元のmain関数へ移動 / go back to main()
(dbx) where =>[1] fibonacci(n = 10), 行 6 “fib.c” [2] main(), 行 7 “fibmain.c” (dbx) print –fx $pc $pc = 0x10c84
(dbx) frame 2 現関数 :main 7 int f10 = fibonacci(10) (dbx) where [1] fibonacci(n = 10), 行 6 “fib.c” =>[2] main(), 行 7 “fibmain.c” (dbx) print –fx $pc $pc = 0x10cd8
STACK セグメント / HOW STACK WORKS
自動変数、関数への引数、関数のリターンアドレスの領域 レジスタに記録
PUSH と同時に値は小さく POP と同時に値は大きく
スタックポインタレジスタ SPARC : SP
x86 : SP(16bit)/ESP(32bit)/RSP(64bit)
ベースポインタ SPARC: FP x86 : BP(16bit)/EBP(32bit)/RBP(64bit)
リターンアドレス
high-address
引数
自動変数
リターンアドレス
引数
自動変数
関数フレーム Function Frame
BP
SP
実行の継続とブレークポイントの削除 / CONTINUE AND DELETE BREAKPOINTS
実行を継続 / continue the run
ブレークポイントを削除し実行を継続 / delete the break points and continue
(dbx) cont stoopped in fibonacci 行位置: 9 ファイル “fib.c” 9 num1 = num2;
(dbx) delete all (dbx) cont F(10) = 55
実行完了。終了コードは、1 です
DBXの終了 / EXITING DBX
終了 / exit (dbx) exit
演習 / PRACTICE
DBXを使ってみよう / LET'S USE DBX
dbxを使ってみよう / let's use dbx デバッガ機能 / debbuger メモリチェッカ機能 / memory checker