ソフトウェア工学
nデバッグ
• テストとデバッグ,printfデバッグ,デバッガ,gdbコマンド,
コンテナ内でのgdbデバッグ,静的解析,プロファイラ,
GUIフロントエンドを用いたPythonデバッグ
玉木徹(名工大)
デバッグ
docker composeの準備
起動する
$ cd 07_01_gdb
$ docker compose build
$ docker compose up -d
確認する
$ docker compose ps
停止する
$ docker compose down
テストとデバッグ
nデバッグ
• コーディングしても
• コンパイルが通らない
• Syntax error
• 実行できない
• 実行時エラー
• Segmentation fault
• Core dump
• 期待した動きをしない
• コードをデバッグする
• 経験と勘を頼りに
nテスト
• コーディングが終わってコードを
実行する
• 実行結果が仕様と一致しているこ
とを確認する
• 異なる場合にはコードを修正す
る
• すべてのモジュールをテストする
• 網羅的に行う
• 系統立てて行う
• 上位モジュールから下位モ
ジュールまですべて
テストとデバッグ
nデバッグ
• コーディングしても
• コンパイルが通らない
• Syntax error
• 実行できない
• 実行時エラー
• Segmentation fault
• Core dump
• 期待した動きをしない
• コードをデバッグする
• 経験と勘を頼りに
nテスト
• コーディングが終わってコードを
実行する
• 実行結果が仕様と一致しているこ
とを確認する
• 異なる場合にはコードを修正す
る
• すべてのモジュールをテストする
• 網羅的に行う
• 系統立てて行う
• 上位モジュールから下位モ
ジュールまですべて
ユ
ニ
ッ
ト
テ
ス
ト
デバッグは開発時の作業
nデバッグの目的
• コンパイルを通すこと
• 実行できるようにすること
• ユニットテストを通すこと
n方法
• 経験と勘
• 開発者のスキル
n重要
• ツールを知ること
• ツールを効率的に使うこと
原始的な方法:print文デバッグ
nコード中に,メッセージを表示するprint文を埋め込む
n実行されたところまでが表示されるので
• エラー箇所の特定がある程度できる
• 変数の値を表示して挙動を確認できる
printfデバッグの例
なんか
おかしい
$ docker compose exec mygcc gcc main.c
$ docker compose exec mygcc ./a.out
b=32768
$
int main(void)
{
int a[5] = {1, 2, 3, 4, 5};
int b, c;
c = a[1] + a[5];
b = c + a[1];
b = myfunc(b, c);
printf("b=%d¥n", b);
return 0;
}
(値はマシンやタイミングで変化します)
int main(void)
{
int a[5] = {1, 2, 3, 4, 5};
int b, c;
printf("c=%d, a1=%d, a5=%d¥n", c, a[1], a[5]);
c = a[1] + a[5];
printf("c=%d, a1=%d, a5=%d¥n", c, a[1], a[5]);
printf("b=%d, c=%d, a1=%d¥n", b, c, a[1]);
b = c + a[1];
printf("b=%d, c=%d, a1=%d¥n", b, c, a[1]);
b = myfunc(b, c);
printf("b=%d¥n", b);
return 0;
}
$ git checkout printf
$
$ docker compose exec mygcc gcc main.c
$ docker compose exec mygcc ./a.out
c=0, a1=2, a5=32764
c=32766, a1=2, a5=32764
b=0, c=32766, a1=2
b=32768, c=32766, a1=2
b=32770
$
$ git checkout main
printfデバッグの例
原因:インデックス範囲の間違い
ここから
おかしい
原始的な方法:print文デバッグ
n利点
• 単純,どの言語でもできる
n欠点
• コードが汚染される
• print文だらけ
• 終わってもprint文を削除し忘れる
• 他の部分まで削除してしまうこともある
• ターミナル表示がキャッシュされることがある(表示されない)
• 通常は改行しないとflushされない
• GUIなどターミナルがない場合には不向き
• オブジェクト指向などスレッドが並列に走ると特定は難しい
• 表示する内容が多すぎるとムリ(行列や画像など)
gdbによるC言語デバッグ
デバッガ
nデバッグ用のツール
• debug, debugger
• gdbが有名(GNU debugger)
nデバッガの利点
• 実行しながら,現在の実行行がわ
かる
• 変数の値もわかる
• 様々なツールがある
• CUI(ターミナル)版
• 元のgdbはこれ
• GUI版,エディタ統合
• バックエンドにはgdbを使う
n各種言語用のデバッガ
• gdb: C, C++, etc
• pdb: Python
• jdb: Java
$ ls
README.md dockerfile main_gprof.c
docker-compose.yml main.c
$
$ docker compose exec mygcc gcc main.c
$
通常のコンパイル
コンテナで
実行する
コマンド
$ git checkout main
$ ls
README.md dockerfile main_gprof.c
docker-compose.yml main.c
$
$ docker compose exec mygcc gcc -g main.c
$
$ docker compose exec mygcc ./a.out
b=32769
$
コンパイル時にデバッグ用シンボルを埋め込む
-g: デバッグ情報を生成
実行結果は通常通り
gdbの起動
gdbの
プロンプト
gdbのオプションに
実行バイナリa.outを指定
ホスト
コンテナ
$ docker compose exec mygcc gdb ./a.out
GNU gdb (Debian 10.1-1.7) 10.1.90.20210103-git
Copyright (C) 2021 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./a.out...
(gdb)
quit:gdbの終了
quit: gdbを終了
ホスト
コンテナ (gdb) quit
$
start
mainの最初の
実行行
start: デバッグを開始.main関数で一旦停止
#include <stdio.h>
int myfunc(int x, int y)
{
int z;
z = 2 * x - y;
return z;
}
int main(void)
{
int a[5] = {1, 2, 3, 4, 5};
int b, c;
c = a[1] + a[5];
b = c + a[1];
b = myfunc(b, c);
printf("b=%d¥n", b);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
(gdb) start
Temporary breakpoint 1 at 0x401148: file main.c, line 13.
Starting program: /mnt/a.out
Temporary breakpoint 1, main () at main.c:13
13 int a[5] = {1, 2, 3, 4, 5};
(gdb)
l(小文字のエル)
l, list: 現在の停止行前後のコードを表示(list)
#include <stdio.h>
int myfunc(int x, int y)
{
int z;
z = 2 * x - y;
return z;
}
int main(void)
{
int a[5] = {1, 2, 3, 4, 5};
int b, c;
c = a[1] + a[5];
b = c + a[1];
b = myfunc(b, c);
printf("b=%d¥n", b);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
(gdb) l
8 return z;
9 }
10
11 int main(void)
12 {
13 int a[5] = {1, 2, 3, 4, 5};
14 int b, c;
15
16 c = a[1] + a[5];
17
(gdb)
p, n
p variable: 変数の値を表示(print)
n: 次の実行行へ移動(next)
13行目をこれ
から実行する
からまだ初期
化されていな
い
13行目が実行
されたので初
期化された
#include <stdio.h>
int myfunc(int x, int y)
{
int z;
z = 2 * x - y;
return z;
}
int main(void)
{
int a[5] = {1, 2, 3, 4, 5};
int b, c;
c = a[1] + a[5];
b = c + a[1];
b = myfunc(b, c);
printf("b=%d¥n", b);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
(gdb) p a
$1 = {4198832, 0, 4198464, 0, -5280}
(gdb)
(gdb) n
16 c = a[1] + a[5];
(gdb) p a
$2 = {1, 2, 3, 4, 5}
(gdb)
n, c
n: 次の実行行へ移動(next)
c: 実行を再開(continue)
関数はスキッ
プして次の行
へすすむ
問題なく
最後まで
実行が終了
main()のあとは
cで終了する
(nではエラーになる)
#include <stdio.h>
int myfunc(int x, int y)
{
int z;
z = 2 * x - y;
return z;
}
int main(void)
{
int a[5] = {1, 2, 3, 4, 5};
int b, c;
c = a[1] + a[5];
b = c + a[1];
b = myfunc(b, c);
printf("b=%d¥n", b);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
(gdb) n
18 b = c + a[1];
(gdb) n
20 b = myfunc(b, c);
(gdb) n
22 printf("b=%d¥n", b);
(gdb) n
b=32773
24 return 0;
(gdb) n
25 }
(gdb) c
Continuing.
[Inferior 1 (process 68) exited normally]
(gdb)
n, s
n: 次の実行へ移動(next)
関数があっても1行進む(step over)
s: 次の実行へ移動(step)
関数があったら関数内へ進む(step in)
関数の中へ
進む
#include <stdio.h>
int myfunc(int x, int y)
{
int z;
z = 2 * x - y;
return z;
}
int main(void)
{
int a[5] = {1, 2, 3, 4, 5};
int b, c;
c = a[1] + a[5];
b = c + a[1];
b = myfunc(b, c);
printf("b=%d¥n", b);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
13 int a[5] = {1, 2, 3, 4, 5};
(gdb) n
16 c = a[1] + a[5];
(gdb) n
18 b = c + a[1];
(gdb) n
20 b = myfunc(b, c);
(gdb) s
myfunc (x=32771, y=32769) at main.c:7
7 z = 2 * x - y;
(gdb) n
8 return z;
(gdb)
n, s
n: 次の実行へ移動(next)
関数があっても1行進む(step over)
s: 次の実行へ移動(step)
関数があったら関数内へ進む(step in)
関数から
戻ってくる
#include <stdio.h>
int myfunc(int x, int y)
{
int z;
z = 2 * x - y;
return z;
}
int main(void)
{
int a[5] = {1, 2, 3, 4, 5};
int b, c;
c = a[1] + a[5];
b = c + a[1];
b = myfunc(b, c);
printf("b=%d¥n", b);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
8 return z;
(gdb) n
9 }
(gdb) n
main () at main.c:22
22 printf("b=%d¥n", b);
(gdb) n
b=32773
24 return 0;
(gdb) n
25 }
(gdb) c
Continuing.
[Inferior 1 (process 72) exited normally]
(gdb)
where
where: 関数呼び出しスタックのどこにいるのかを表示
関数の中へ
進む
現在は
mainの中
現在はmainから呼び出された
myfuncの中
#include <stdio.h>
int myfunc(int x, int y)
{
int z;
z = 2 * x - y;
return z;
}
int main(void)
{
int a[5] = {1, 2, 3, 4, 5};
int b, c;
c = a[1] + a[5];
b = c + a[1];
b = myfunc(b, c);
printf("b=%d¥n", b);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
13 int a[5] = {1, 2, 3, 4, 5};
(gdb) n
16 c = a[1] + a[5];
(gdb) n
18 b = c + a[1];
(gdb) where
#0 main () at main.c:18
(gdb) n
20 b = myfunc(b, c);
(gdb) s
myfunc (x=32771, y=32769) at main.c:7
7 z = 2 * x - y;
(gdb) where
#0 myfunc (x=32771, y=32769) at main.c:7
#1 0x0000000000401190 in main () at main.c:20
(gdb)
(gdb) start
Temporary breakpoint 5 at 0x401148: file main.c, line 13.
Starting program: /mnt/a.out
Temporary breakpoint 1, main () at main.c:13
13 int a[5] = {1, 2, 3, 4, 5};
(gdb) c
Continuing.
b=32773
[Inferior 1 (process 75) exited normally]
(gdb)
b: breakpoint
b: ブレークポイント(実行を中断する行)を設定
ブレークポイントが
ないと,continueで
最後まで実行される
start直後は
デフォルトで
main()に設定
されている
#include <stdio.h>
int myfunc(int x, int y)
{
int z;
z = 2 * x - y;
return z;
}
int main(void)
{
int a[5] = {1, 2, 3, 4, 5};
int b, c;
c = a[1] + a[5];
b = c + a[1];
b = myfunc(b, c);
printf("b=%d¥n", b);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
(gdb) i b
No breakpoints or watchpoints.
(gdb) b 20
Breakpoint 2 at 0x401181: file main.c, line 20.
(gdb) i b
Num Type Disp Enb Address What
2 breakpoint keep y 0x0000000000401181 in main at main.c:20
(gdb)
b: breakpoint
b: ブレークポイント(実行を中断する行)を設定
ブレークポイント
を20行目に設定
i b (info breakpoint)
設定されているブレークポイントをすべて表示
start後
ブレークポイント
で実行が中断
#include <stdio.h>
int myfunc(int x, int y)
{
int z;
z = 2 * x - y;
return z;
}
int main(void)
{
int a[5] = {1, 2, 3, 4, 5};
int b, c;
c = a[1] + a[5];
b = c + a[1];
b = myfunc(b, c);
printf("b=%d¥n", b);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
13 int a[5] = {1, 2, 3, 4, 5};
(gdb) c
Continuing.
Breakpoint 2, main () at main.c:20
20 b = myfunc(b, c);
(gdb)
(gdb) i b
Num Type Disp Enb Address What
2 breakpoint keep y 0x0000000000401181 in main at main.c:20
breakpoint already hit 1 time
(gdb) d 2
(gdb) i b
No breakpoints or watchpoints.
(gdb)
d
d n: ブレークポイントnを削除(delete)
2番目のブレークポイントを削除
#include <stdio.h>
int myfunc(int x, int y)
{
int z;
z = 2 * x - y;
return z;
}
int main(void)
{
int a[5] = {1, 2, 3, 4, 5};
int b, c;
c = a[1] + a[5];
b = c + a[1];
b = myfunc(b, c);
printf("b=%d¥n", b);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
ブレークポイント番号
13 int a[5] = {1, 2, 3, 4, 5};
(gdb) watch b
Hardware watchpoint 5: b
(gdb) i b
Num Type Disp Enb Address What
5 hw watchpoint keep y b
(gdb) c
Continuing.
Hardware watchpoint 5: b
Old value = 0
New value = 32771
main () at main.c:20
20 b = myfunc(b, c);
(gdb)
watchpoint
ブレークポイント:実行を中断する行を設定
ウォッチポイント:値が変わったら実行を中断する変数を設定
変数bにウォッ
チポイントを
設定
ウォッチポイントに
なっている
実行を再
開すると
18行目でbの
値が変わる
ので
20行目の実
行前で停止
する
#include <stdio.h>
int myfunc(int x, int y)
{
int z;
z = 2 * x - y;
return z;
}
int main(void)
{
int a[5] = {1, 2, 3, 4, 5};
int b, c;
c = a[1] + a[5];
b = c + a[1];
b = myfunc(b, c);
printf("b=%d¥n", b);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
watchpoint
ブレークポイント:実行を中断する行を設定
ウォッチポイント:値が変わったら実行を中断する変数を設定
22行目で
停止
20行目でも
変わるので
#include <stdio.h>
int myfunc(int x, int y)
{
int z;
z = 2 * x - y;
return z;
}
int main(void)
{
int a[5] = {1, 2, 3, 4, 5};
int b, c;
c = a[1] + a[5];
b = c + a[1];
b = myfunc(b, c);
printf("b=%d¥n", b);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
20 b = myfunc(b, c);
(gdb) c
Continuing.
Hardware watchpoint 5: b
Old value = 32771
New value = 32773
main () at main.c:22
22 printf("b=%d¥n", b);
(gdb)
cで続けると
display, undisplay
display variable: 停止毎に値を表示する変数を設定
変数aを表示
する設定
変数bを表示
する設定
変数cを表示
する設定
停止したの
でa, b, cを表
示
停止したの
でa, b, cを表
示
undisplay variable: 表示を停止
#include <stdio.h>
int myfunc(int x, int y)
{
int z;
z = 2 * x - y;
return z;
}
int main(void)
{
int a[5] = {1, 2, 3, 4, 5};
int b, c;
c = a[1] + a[5];
b = c + a[1];
b = myfunc(b, c);
printf("b=%d¥n", b);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
13 int a[5] = {1, 2, 3, 4, 5};
(gdb) display a
1: a = {4198832, 0, 4198464, 0, -5280}
(gdb) display b
2: b = 0
(gdb) display c
3: c = 0
(gdb) n
16 c = a[1] + a[5];
1: a = {1, 2, 3, 4, 5}
2: b = 0
3: c = 0
(gdb) n
18 b = c + a[1];
1: a = {1, 2, 3, 4, 5}
2: b = 0
3: c = 32769
(gdb)
フロントエンド(GUI)
continue
step over
step in
step out
restart
stop
現在の実行行
ブレークポイント
標準出力
関数
呼び出し
スタック
変数
ウォッチ
変数の
値表示
フロントエンドの例
(VS code)
様々なGUIツールがあるが
操作内容はほぼ同じ
VS codeでコンテナgdb
コンテナ内にも拡張機能をいれておく
C言語デバッガの
フロントエンドをインストール
ビルド
コマンドパレットを開いて
configure taskと入力
出てきた
Tasks: Configure Task
を選択
コマンドパレットの開き方
• win: Ctrl+Shift+p
• macOS: Cmd+Shift+p
• メニュー à コマンドパレット
このページの内容は行わないでください
(すでに設定済みです.自分で最初から作る場
合のための説明です)
ここでは普通のgccを選択
(どちらでもOK)
このページの内容は行わないでください
(すでに設定済みです.自分で最初から作る場
合のための説明です)
tasks.jsonのテンプレートが開く
(このまま保存すればOK)
コンパイラ
-gがつ
いてる
このページの内容は行わないでください
(すでに設定済みです.自分で最初から作る場
合のための説明です)
ビルド(コンパイル)する
main.cを開いておくこと
(開いているファイルを
ビルドします)
これを選択(これがtasks.jsonのラベル)
ビルドされた
実行バイナリ
デバッグ
デバッグを開始
このページの内容は行わないでください
(すでに設定済みです.自分で最初から作る場
合のための説明です)
gdbを選択
このページの内容は行わないでください
(すでに設定済みです.自分で最初から作る場
合のための説明です)
これを選択
このページの内容は行わないでください
(すでに設定済みです.自分で最初から作る場
合のための説明です)
launch.jsonのテンプレートが開く
(このまま保存すればOK)
これがデバッグす
る実行バイナリ
“main.c”をデバッグするなら,同じ
フォルダ内の拡張子なしのファイ
ル(つまりmain)を使う
このページの内容は行わないでください
(すでに設定済みです.自分で最初から作る場
合のための説明です)
デバッグするファイルを選ぶ
行番号の左部分を押して
ブレークポイントを設定しておく
デバッグのタブへ行って
これを選択(これがlaunch.jsonのラベル)
デバッグが始まって
ブレークポイントで停止中
あとは少しずつ実行していく
これを押したらデバッグ開始
continue
step over step in
step out
(関数を最後まで実行
して抜ける)
終了
ターミナルタブの
cppdbgに,出力
が表示されている
静的解析
lint, linter
静的解析とは
nコンパイル前や実行前にエラーを検出するツール
• 「lint」(糸くず)
• こまかいエラー(糸くず)を除去することから命名
• この種のツールをlintやlinterと呼ぶ
n静的解析(static analysis)
• 「コンパイルが通らない」問題
• (GUIなら)コーディングしている最中に文法エラーを指摘
• 「実行できない」問題
• コンパイラよりも厳密にエラーを検出
• 変数の範囲外インデックスなど
例
n右のコードの問題点
• インデックスの範囲外指定
• コーディング中には気が付かない...
静的解析ツールの利用
ngccによるコンパイル
• 構文エラーではないのでコンパイル時には検出されない
ncppcheckによる静的解析
• C/C++のlinter
• 範囲外インデックス指定などの主なエラーが検出される
• gccの警告(Warning)オプション
• 「all」すべての警告を表示
• それでも表示されない
コンパイラ時に静的解析ツールを利用
nclangによるコンパイル
• gccとは別のコンパイラ
• コンパイラによっては静的解析を行う
VS codeでlint
linter用の拡張機能をインストール
コンテナ内に
コーディング中にlinterが走る
(問題があれば赤い波下線)
ファイルに問
題があるとそ
の数が表示
まずコマンドパレットで
最初に“flyling toggle…”で検索して
Trust Flagをオンにする
(これで使えるようになる)
(不要かも?)
マウスオーバーで
linterの結果を表示
プロファイラ
プロファイリングとは
n デバッグ
• うまく動くように頑張る
n 静的解析
• エラーを検出する
n プロファイリング(性能解析)
• パフォーマンスのボトルネックを探す
• コードのどこで実行に時間がかかっているのかを見つける
• 関数呼び出しの回数
• 関数呼び出しにかかる時間
• ループ回数
• プロファイラ
• プロファイリングのためのツール
• gccならgprof
$ docker compose exec mygcc gcc -g -pg main_gprof.c -o main_gprof
$
$ docker compose exec mygcc ./main_gprof
$ ls -l gmon.out
-rw-r--r-- 1 tamaki staff 553 6 2 11:51 gmon.out
$
コンパイル時に指定
main_gprof.c
-g デバッグ情報生成
-pg プロファイリング情報生成 -o 生成バイナリファイル名
実行するとgmon.out
というファイルができる
gprofの出力
gprof:プロファイラ
-b:出力を短く
実行バイナリ プロファイル情
報ファイル
呼び出された
回数
呼び出しあたりの
合計実行時間
合計
実行時間
$ docker compose exec mygcc gprof -b main_gprof gmon.out
Flat profile:
Each sample counts as 0.01 seconds.
no time accumulated
% cumulative self self total
time seconds seconds calls Ts/call Ts/call name
0.00 0.00 0.00 2000 0.00 0.00 myfunc
0.00 0.00 0.00 300 0.00 0.00 myfunc_3
0.00 0.00 0.00 100 0.00 0.00 myfunc_2
Call graph
granularity: each sample hit covers 2 byte(s) no time propagated
index % time self children called name
0.00 0.00 500/2000 myfunc_2 [3]
0.00 0.00 1500/2000 myfunc_3 [2]
[1] 0.0 0.00 0.00 2000 myfunc [1]
-----------------------------------------------
0.00 0.00 300/300 main [9]
[2] 0.0 0.00 0.00 300 myfunc_3 [2]
0.00 0.00 1500/2000 myfunc [1]
-----------------------------------------------
0.00 0.00 100/100 main [9]
[3] 0.0 0.00 0.00 100 myfunc_2 [3]
0.00 0.00 500/2000 myfunc [1]
gprofの出力
2000回の呼び出しのうち
myfunc_2から500回
myfunc_3から1500回
ソフトウェア工学2023 10 デバッグ
Dockerでpythonをデバッ
グ
docker composeを利用する
ndockerfile
FROM python:slim
RUN pip install pylint flake8
WORKDIR /mnt
linterを2種類
入れておく
起動する
$ cd 07_02_python_debug
$ docker compose build
$ docker compose up -d
確認する
$ docker compose ps
停止する
$ docker compose down
コンテナを選択
これを押して...
フォルダを選ん
で...
OK!
拡張機能を入れ
よう
pythonで検索
Microsoftの
python拡張をインス
トール
コンテナ内にも拡張機能をいれておく
pylanceで検索
Pylanceもいれておく
コンテナ内にも拡張機能をいれておく
pythonコードを
選んで
どのpythonを使
うかを選択
使うものを選ぶ
(ここでは1つ
しかない)
すでにpythonが自動選択
されていれば不要
するとこのファイ
ルが出来上がる
選んだpythonが表
示されている
このページの内容は行わないでください
(すでに設定済みです.自分で最初から作る場
合のための説明です)
デバッグのタブ
から
設定ファイルを
作成
このページの内容は行わないでください
(すでに設定済みです.自分で最初から作る場
合のための説明です)
これを選択
「current active file」
このページの内容は行わないでください
(すでに設定済みです.自分で最初から作る場
合のための説明です)
このページの内容は行わないでください
(すでに設定済みです.自分で最初から作る場
合のための説明です)
作成されるlaunch.jsonに
この行を選択
(cwdの設定)
この実行ボタンを押すと
デバック開始
ブレークポイントは指定
しておく
pythonファイルを開いて
おくこと(開いている
ファイルをデバッグす
る)
指定したブレークポイ
ントで止まった
continue
step over step in
step out
(関数を最後まで実行
して抜ける)
終了
step over / in / outで
デバッグ中
エラーが起きると
このような表示になる
コマンドパレットから
select linter
を検索して...
すでに設定されていれば不要です
pylintを選択
flake8でも良い
すでに設定されていれば不要です
わざとカッコを余分に付けてみた例
linterが警告を表示する
ソフトウェア工学2023 10 デバッグ
課題
nDockerとVScodeで
• Cのデバッグを行う
• gdbを使ってデバッグを行う
• lintを使って静的解析を行う
• gprofを使ってプロファイリングを行う
• pythonのデバッグを行う
• pylint, flake8を使って静的解析を行う
想定試験問題
nprint文デバッグと,その問題点は何かを説明せよ
ngdbのコマンドの意味と使い方を説明せよ
• p, n, c, s, b, d
• where, watch, display
n静的解析とは何か,その有用性を説明せよ
nプロファイリングと何か,その重要性を説明せよ

More Related Content

PDF
Debug Hacks at Security and Programming camp 2011
PDF
Programming camp 2010 debug hacks
PDF
大学でC言語をはじめて触る人へ
PDF
逆戻りデバッグ補助のための嵌入的スパイの試作
PDF
programming camp 2008, Debug
PDF
研究生のためのC++ no.2
ODP
Programming camp Debug Hacks
PDF
Hacking Ruby with Python
Debug Hacks at Security and Programming camp 2011
Programming camp 2010 debug hacks
大学でC言語をはじめて触る人へ
逆戻りデバッグ補助のための嵌入的スパイの試作
programming camp 2008, Debug
研究生のためのC++ no.2
Programming camp Debug Hacks
Hacking Ruby with Python

Similar to ソフトウェア工学2023 10 デバッグ (20)

PPTX
第2回セキュリティ勉強会 GDBコマンド
PPTX
Coqでsprintf
PDF
関数プログラミング入門
PPTX
Misrac20150523
PPTX
ネイティブコードを語る
PDF
Misrac20150523
PDF
LLVM最適化のこつ
PPTX
Coqでsprintf
PDF
llvm入門
PDF
V6 unix in okinawa
ODP
0x300
PDF
第2回勉強会スライド
PDF
ソースコードリーディングの基礎
PPTX
競技プログラミングのためのC++入門
PDF
C/C++プログラマのための開発ツール
PPTX
ガイオプライベートセミナー2012秋(坂本)
PDF
第1回勉強会スライド
PPTX
90分 Scheme to C(勝手に抄訳版)
KEY
core dumpでcode golf
PDF
家に帰るまでが遠足です
第2回セキュリティ勉強会 GDBコマンド
Coqでsprintf
関数プログラミング入門
Misrac20150523
ネイティブコードを語る
Misrac20150523
LLVM最適化のこつ
Coqでsprintf
llvm入門
V6 unix in okinawa
0x300
第2回勉強会スライド
ソースコードリーディングの基礎
競技プログラミングのためのC++入門
C/C++プログラマのための開発ツール
ガイオプライベートセミナー2012秋(坂本)
第1回勉強会スライド
90分 Scheme to C(勝手に抄訳版)
core dumpでcode golf
家に帰るまでが遠足です
Ad

More from Toru Tamaki (20)

PDF
論文紹介:Unboxed: Geometrically and Temporally Consistent Video Outpainting
PDF
論文紹介:OVO-Bench: How Far is Your Video-LLMs from Real-World Online Video​ Unde...
PDF
論文紹介:HOTR: End-to-End Human-Object Interaction Detection​ With Transformers, ...
PDF
論文紹介:Segment Anything, SAM2: Segment Anything in Images and Videos
PDF
論文紹介:Unbiasing through Textual Descriptions: Mitigating Representation Bias i...
PDF
論文紹介:AutoPrompt: Eliciting Knowledge from Language Models with Automatically ...
PDF
論文紹介:「Amodal Completion via Progressive Mixed Context Diffusion」「Amodal Insta...
PDF
論文紹介:「mPLUG-Owl3: Towards Long Image-Sequence Understanding in Multi-Modal La...
PDF
論文紹介:What, when, and where? ​Self-Supervised Spatio-Temporal Grounding​in Unt...
PDF
論文紹介:PitcherNet: Powering the Moneyball Evolution in Baseball Video Analytics
PDF
論文紹介:"Visual Genome:Connecting Language and Vision​Using Crowdsourced Dense I...
PDF
論文紹介:"InfLoRA: Interference-Free Low-Rank Adaptation for Continual Learning" ...
PDF
論文紹介:ActionSwitch: Class-agnostic Detection of Simultaneous Actions in Stream...
PDF
論文紹介:Make Pixels Dance: High-Dynamic Video Generation
PDF
PCSJ-IMPS2024招待講演「動作認識と動画像符号化」2024年度画像符号化シンポジウム(PCSJ 2024) 2024年度映像メディア処理シンポジ...
PDF
論文紹介:T-DEED: Temporal-Discriminability Enhancer Encoder-Decoder for Precise E...
PDF
論文紹介:On Feature Normalization and Data Augmentation
PDF
論文紹介:CLIFF: Continual Latent Diffusion for Open-Vocabulary Object Detection
PDF
論文紹介:MS-DETR: Efficient DETR Training with Mixed Supervision
PDF
論文紹介:Synergy of Sight and Semantics: Visual Intention Understanding with CLIP
論文紹介:Unboxed: Geometrically and Temporally Consistent Video Outpainting
論文紹介:OVO-Bench: How Far is Your Video-LLMs from Real-World Online Video​ Unde...
論文紹介:HOTR: End-to-End Human-Object Interaction Detection​ With Transformers, ...
論文紹介:Segment Anything, SAM2: Segment Anything in Images and Videos
論文紹介:Unbiasing through Textual Descriptions: Mitigating Representation Bias i...
論文紹介:AutoPrompt: Eliciting Knowledge from Language Models with Automatically ...
論文紹介:「Amodal Completion via Progressive Mixed Context Diffusion」「Amodal Insta...
論文紹介:「mPLUG-Owl3: Towards Long Image-Sequence Understanding in Multi-Modal La...
論文紹介:What, when, and where? ​Self-Supervised Spatio-Temporal Grounding​in Unt...
論文紹介:PitcherNet: Powering the Moneyball Evolution in Baseball Video Analytics
論文紹介:"Visual Genome:Connecting Language and Vision​Using Crowdsourced Dense I...
論文紹介:"InfLoRA: Interference-Free Low-Rank Adaptation for Continual Learning" ...
論文紹介:ActionSwitch: Class-agnostic Detection of Simultaneous Actions in Stream...
論文紹介:Make Pixels Dance: High-Dynamic Video Generation
PCSJ-IMPS2024招待講演「動作認識と動画像符号化」2024年度画像符号化シンポジウム(PCSJ 2024) 2024年度映像メディア処理シンポジ...
論文紹介:T-DEED: Temporal-Discriminability Enhancer Encoder-Decoder for Precise E...
論文紹介:On Feature Normalization and Data Augmentation
論文紹介:CLIFF: Continual Latent Diffusion for Open-Vocabulary Object Detection
論文紹介:MS-DETR: Efficient DETR Training with Mixed Supervision
論文紹介:Synergy of Sight and Semantics: Visual Intention Understanding with CLIP
Ad

ソフトウェア工学2023 10 デバッグ