i117 プログラミング演習ii i117 programming ii ...shinoda- · 6. 2011/06/23(thu):...

25
I117 プログラミング演習II I117 PROGRAMMING PRACTICE II ソフトウェア開発環境1 SOFTWARE DEVELOPMENT ENV. 1 情報社会基盤研究センター Research Center for Advanced Computing Infrastructure (RCACI) 小原 泰弘 / Yasuhiro Ohara [email protected]

Upload: others

Post on 06-Oct-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: I117 プログラミング演習II I117 PROGRAMMING II ...shinoda- · 6. 2011/06/23(Thu): ソフトウェア開発 環境1 / Software Development Env. 1 7. 2011/06/28(Tue): ソフトウェア開発

I117 プログラミング演習II I117 PROGRAMMING PRACTICE II ソフトウェア開発環境1 SOFTWARE DEVELOPMENT ENV. 1 情報社会基盤研究センター Research Center for Advanced Computing Infrastructure (RCACI)

小原 泰弘 / Yasuhiro Ohara

[email protected]

Page 2: I117 プログラミング演習II I117 PROGRAMMING II ...shinoda- · 6. 2011/06/23(Thu): ソフトウェア開発 環境1 / Software Development Env. 1 7. 2011/06/28(Tue): ソフトウェア開発

スケジュール / 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

Page 3: I117 プログラミング演習II I117 PROGRAMMING II ...shinoda- · 6. 2011/06/23(Thu): ソフトウェア開発 環境1 / Software Development Env. 1 7. 2011/06/28(Tue): ソフトウェア開発

課題(自由課題) / 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

Page 4: I117 プログラミング演習II I117 PROGRAMMING II ...shinoda- · 6. 2011/06/23(Thu): ソフトウェア開発 環境1 / Software Development Env. 1 7. 2011/06/28(Tue): ソフトウェア開発

今日の目次 / TODAY'S INDEX

 デバッグ / dubugging   デバッグ手法 / debugging method

  printf デバッグ / printf debug

  デバッガ / debugger   メモリチェッカ / memory checker

Page 5: I117 プログラミング演習II I117 PROGRAMMING II ...shinoda- · 6. 2011/06/23(Thu): ソフトウェア開発 環境1 / Software Development Env. 1 7. 2011/06/28(Tue): ソフトウェア開発

デバッグ手法 / DEBUGGING METHOD

Page 6: I117 プログラミング演習II I117 PROGRAMMING II ...shinoda- · 6. 2011/06/23(Thu): ソフトウェア開発 環境1 / Software Development Env. 1 7. 2011/06/28(Tue): ソフトウェア開発

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

Page 7: I117 プログラミング演習II I117 PROGRAMMING II ...shinoda- · 6. 2011/06/23(Thu): ソフトウェア開発 環境1 / Software Development Env. 1 7. 2011/06/28(Tue): ソフトウェア開発

バグのあるプログラム / 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

Page 8: I117 プログラミング演習II I117 PROGRAMMING II ...shinoda- · 6. 2011/06/23(Thu): ソフトウェア開発 環境1 / Software Development Env. 1 7. 2011/06/28(Tue): ソフトウェア開発

各ステップの状態を表示 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; }

Page 9: I117 プログラミング演習II I117 PROGRAMMING II ...shinoda- · 6. 2011/06/23(Thu): ソフトウェア開発 環境1 / Software Development Env. 1 7. 2011/06/28(Tue): ソフトウェア開発

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

Page 10: I117 プログラミング演習II I117 PROGRAMMING II ...shinoda- · 6. 2011/06/23(Thu): ソフトウェア開発 環境1 / Software Development Env. 1 7. 2011/06/28(Tue): ソフトウェア開発

マクロ・プリプロセッサの利用 / 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; }

Page 11: I117 プログラミング演習II I117 PROGRAMMING II ...shinoda- · 6. 2011/06/23(Thu): ソフトウェア開発 環境1 / Software Development Env. 1 7. 2011/06/28(Tue): ソフトウェア開発

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

Page 12: I117 プログラミング演習II I117 PROGRAMMING II ...shinoda- · 6. 2011/06/23(Thu): ソフトウェア開発 環境1 / Software Development Env. 1 7. 2011/06/28(Tue): ソフトウェア開発

マクロ・プリプロセッサの利用(中級編) / 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)); /* (())と二重にすることに注意 */

Page 13: I117 プログラミング演習II I117 PROGRAMMING II ...shinoda- · 6. 2011/06/23(Thu): ソフトウェア開発 環境1 / Software Development Env. 1 7. 2011/06/28(Tue): ソフトウェア開発

大量にログが出力されるときの対処 / 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

Page 14: I117 プログラミング演習II I117 PROGRAMMING II ...shinoda- · 6. 2011/06/23(Thu): ソフトウェア開発 環境1 / Software Development Env. 1 7. 2011/06/28(Tue): ソフトウェア開発

デバッガ / DEBUGGER

Page 15: I117 プログラミング演習II I117 PROGRAMMING II ...shinoda- · 6. 2011/06/23(Thu): ソフトウェア開発 環境1 / Software Development Env. 1 7. 2011/06/28(Tue): ソフトウェア開発

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...

Page 16: I117 プログラミング演習II I117 PROGRAMMING II ...shinoda- · 6. 2011/06/23(Thu): ソフトウェア開発 環境1 / Software Development Env. 1 7. 2011/06/28(Tue): ソフトウェア開発

デバッグ情報の付加と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コマンドのヘルプを表示 ...

Page 17: I117 プログラミング演習II I117 PROGRAMMING II ...shinoda- · 6. 2011/06/23(Thu): ソフトウェア開発 環境1 / Software Development Env. 1 7. 2011/06/28(Tue): ソフトウェア開発

対象ソースコード / 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 }

Page 18: I117 プログラミング演習II I117 PROGRAMMING II ...shinoda- · 6. 2011/06/23(Thu): ソフトウェア開発 環境1 / Software Development Env. 1 7. 2011/06/28(Tue): ソフトウェア開発

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

Page 19: I117 プログラミング演習II I117 PROGRAMMING II ...shinoda- · 6. 2011/06/23(Thu): ソフトウェア開発 環境1 / Software Development Env. 1 7. 2011/06/28(Tue): ソフトウェア開発

ステップ実行と変数への代入 / 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

Page 20: I117 プログラミング演習II I117 PROGRAMMING II ...shinoda- · 6. 2011/06/23(Thu): ソフトウェア開発 環境1 / Software Development Env. 1 7. 2011/06/28(Tue): ソフトウェア開発

関数の呼び出し履歴の表示とフレームの移動 / 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

Page 21: I117 プログラミング演習II I117 PROGRAMMING II ...shinoda- · 6. 2011/06/23(Thu): ソフトウェア開発 環境1 / Software Development Env. 1 7. 2011/06/28(Tue): ソフトウェア開発

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

Page 22: I117 プログラミング演習II I117 PROGRAMMING II ...shinoda- · 6. 2011/06/23(Thu): ソフトウェア開発 環境1 / Software Development Env. 1 7. 2011/06/28(Tue): ソフトウェア開発

実行の継続とブレークポイントの削除 / 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 です

Page 23: I117 プログラミング演習II I117 PROGRAMMING II ...shinoda- · 6. 2011/06/23(Thu): ソフトウェア開発 環境1 / Software Development Env. 1 7. 2011/06/28(Tue): ソフトウェア開発

DBXの終了 / EXITING DBX

 終了 / exit (dbx) exit

Page 24: I117 プログラミング演習II I117 PROGRAMMING II ...shinoda- · 6. 2011/06/23(Thu): ソフトウェア開発 環境1 / Software Development Env. 1 7. 2011/06/28(Tue): ソフトウェア開発

演習 / PRACTICE

Page 25: I117 プログラミング演習II I117 PROGRAMMING II ...shinoda- · 6. 2011/06/23(Thu): ソフトウェア開発 環境1 / Software Development Env. 1 7. 2011/06/28(Tue): ソフトウェア開発

DBXを使ってみよう / LET'S USE DBX

  dbxを使ってみよう / let's use dbx   デバッガ機能 / debbuger   メモリチェッカ機能 / memory checker