Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
デバッグの話 / Debugging for Beginners
Search
kaityo256
PRO
October 10, 2024
Programming
2.1k
18
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
デバッグの話 / Debugging for Beginners
主に数値計算屋向けのデバッグの話。
kaityo256
PRO
October 10, 2024
More Decks by kaityo256
See All by kaityo256
勾配ブースティングと決定木の話 / gradient boosting and decision trees
kaityo256
PRO
7
1.6k
GNU Makeの使い方 / How to use GNU Make
kaityo256
PRO
16
5.8k
この講義について / 00-setup
kaityo256
PRO
2
450
GitHubによるWebアプリケーションのデプロイ / 07-github-deploy
kaityo256
PRO
2
360
演習:Gitの基本操作 / 04-git-basic
kaityo256
PRO
1
580
演習:Gitの応用操作 / 05-git-advanced
kaityo256
PRO
1
350
演習:GitHubの基本操作 / 06-github-basic
kaityo256
PRO
1
410
バージョン管理とは / 01-a-vcs
kaityo256
PRO
2
390
Gitの仕組みと用語 / 01-b-term
kaityo256
PRO
1
480
Other Decks in Programming
See All in Programming
これからAgentCoreを触る方へトレンドはGatewayです
har1101
6
490
型も通る、synthも通る、それでも危ない 〜AIのCDKの権限とコストを機械で検証する〜 / It Passes Type Checks, It Passes Synth Checks, but It’s Still Risky — Automatically Verifying Permissions and Costs in AI’s CDK —
seike460
PRO
1
320
アルゴリズムは何を圧縮しているのか ─ Haskell から育った「圧縮代数」というメンタルモデル
naoya
16
3.5k
Apache Hive: そしてCloud Native Lakehouseへ
okumin
1
130
Terraform標準の組織で AWS CDKをどう使うか
mu7889yoon
0
220
エンジニア向け会社紹介/Findy Company Profile
findyinc
6
360k
分散システム、なんですぐ死んでしまうん?耐障害性を高めたいあなたのためのレジリエンスパターン入門
mshibuya
7
6.2k
AI 輔助遺留系統現代化的經驗分享
jame2408
1
1.2k
【やさしく解説 設計編 #0】DDDのコード、読めるのに分からない人へ
panda728
PRO
2
270
SLOをサービス品質の共通言語にするために 取り組んできたこと
wakana0222
0
500
えっ!!コードを読まずに開発を!?
hananouchi
0
210
なぜ関数型プログラミングで「型」と「証明」が語られるのか #fp_matsuri
kajitack
3
940
Featured
See All Featured
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
1.1k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.3k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
550
Navigating Team Friction
lara
192
16k
WCS-LA-2024
lcolladotor
0
710
Deep Space Network (abreviated)
tonyrice
0
230
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
Raft: Consensus for Rubyists
vanstee
141
7.6k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.5k
My Coaching Mixtape
mlcsv
0
170
Transcript
1 22 デバッグの話 慶應義塾大学理工学部物理情報工学科 渡辺宙志 2024/10/10 研究室ミーティング 主に数値計算屋向けの
2 22 注意 この資料は一人で小規模なコードを開発する人向け、すなわ ち自分で入れたバグを自分でデバッグするためのものです。 数値計算屋みたいな
3 22 典型的な研究スパン 年に二編論文を書く → 半年で一つの研究が完結 プログラム開発+計算 執筆 調査 •
調査:先行研究の調査や、計算手法についての調査 • 開発+計算:プログラム開発、計算の実行 • 執筆:結果の解析+論文執筆+投稿 しかし実態は・・・ 執筆 調査 デバッグ 開発 • 開発時間の大部分はデバッグに費やされている • 初心者であるほど、デバッグの占める割合が長くなる • コードの高速化は、研究時間の短縮にさほど寄与しない 計算
4 22 デバッグは進捗ではない 開発 デバッグ 開発 デバッグ 計算 解析 開発
デバッグ 計算 解析 解析 計算 Aさん Bさん デバッグは時間がかかり、集中力が要求され、達成感もある しかし、結局は自分で入れたバグを自分で取る作業(マッチポンプ) 作業している時間が長いのはAさんだが、進捗が出ているのはBさん 「デバッグは進捗ではない」ということを肝に銘じること
5 22 デバッグの基本哲学 「ここまでは大丈夫」という砦を築きながら進む 頭を使わない なるべく機械的にチェックできる仕組みを作る 頭を使うのは最後の最後だけ 安全地帯を作る
6 22 デバッグの基本哲学 重要な書類をなくしてしまった 手当たり次第に探す 「ここには無い」という場所を広げる
7 22 頭を使わない 調べた書類の束を部屋の中においておくと・・・ チェック済み チェック済み 未チェック 「どの束を調べたか」を覚えておかなくてはいけない →デバッグ時は頭を使ってはならない
8 22 安全地帯を作る チェック済みの書類は部屋の外に出す まだ調べていない チェック済み 砦 確実にこっち側には無い あるとすればこっち側 デバッグは「ここまでは大丈夫」という領域を広げる作業
作業が進むほど「ここは大丈夫」という安全地帯が増える 何かを記憶する必要がない(単純作業になる)
9 22 デバッグで最も重要なこと バグを素早く修正すること バグの原因を究明すること そもそもバグを入れないこと バグを入れないコーディング バグを発見した時の対処法
10 22 コードを書く際の注意 いきなりコード全体を書いて動 作確認してはならない ※特にAIを使う人は注意
11 22 例:分子動力学法 1. 相互作用がない粒子の時間発展を調べる 周期境界条件の確認 自由境界条件(反射壁)の確認 2. 相互作用のある二粒子の衝突を調べる エネルギーが保存することを確認
(カットオフの実装が正しいか?) 運動量が保存することを確認 軌道が正しいか確認
12 22 例:分子動力学法 3. 相互作用のある二粒子の衝突をまだ調べる 周期境界をまたいだ衝突は大丈夫か? 斜め方向に衝突した時の軌道は 想定通りか? 以上のチェックにより以下が「安全地帯」となる •
境界条件の扱い • 力の計算 • エネルギーの計算 (特にカットオフまわり) 多粒子系にしてバグったら、追加で実装した箇所を疑う
13 22 例:モンテカルロ法 二次元ポッツ模型を書けと言われた →初手で二次元ポッツ模型を書きはじめない 1. スピンが2つしかないイジング模型を書く 状態が4つしかないので、厳密解と比較可能 エネルギー、磁化などの温度依存性が厳密解と一致することを確認する (スピンフリップの実装が正しいことを確認)
2. 一次元イジング模型を書く エネルギー、磁化などの温度依存性が厳密解と一致することを確認する ここまで確認後、一次元ポッツ、二次元イジング、二次元ポッツ、へと進む バグが入ったら、厳密解と一致したところからの差分だけをチェック
14 22 バグを見つけた時 いきなりコードを修正してはならない バグの原因を特定しないままコードを修正し、正しいと思える振る舞い になったとしても、潜在的にバグが残っていてあとで困ることが多い
15 22 バグを見つけたら? ある程度開発が進んだコードでバグを見つけた いきなりデバッグをはじめない A B C デバッグにおいて最重要なのは原因究明 「いつのまにかなおっていた」は一番まずい
→最初にやることは現場保全
16 22 バグを見つけたら? まず再現性の確認 • 本当にバグってる? • どの環境で、どのインプットファイルを使い、どんな実行方 法で、どんなバグが出たかを確定させる •
ビルドミスはないか?正しいインプットファイルを渡してい るか?実行方法は正しいか? 現場保全 • デバッグ用ブランチを作成し、バグが発生するソースを保存 • 研究日記(←書いてるはず)に、ブランチ名と発生条件を記録 安全地帯の確保 • 「ここまではバグっていなかったはず」まで戻り、動作を確認 • 一番最新の「バグっていないコード」を安全地帯として確保する ここまで動作確認と単純作業しかしていない デバッグはなるべく頭を使わない
17 22 デバッグの基本は比較 できる限り現時点に近い安全地帯を確保し、容疑者を限定してから デバッグを開始する バグっていなかったコード(安全地帯) バグったコード 安全地帯からの修正箇所 バグが混入したとしたら、ここ
18 22 例:LAMMPS 何か複雑な初期状態や境界条件(外力など)を加えたインプット ファイルが動作しない ファイルを修正しながら期待する 動作になるまで何度も実行する 確実に動作するファイルを探し、動 作しないファイルとの差を調べる
19 22 二分探索 コードを実行したらSegmentation Faultと言われて止まった やってはならないこと ソースを見ながら原因を探してはならない 特に頭の中でトレース実行するのはダメ デバッグはなるべく頭を使わない やるべきこと
まず、どこで止まったかを調べる → print文による二分探索 void func() { printf("1¥n"); // 何か処理 printf("2¥n"); // 何か処理 printf("3¥n"); } 出力が「1」ならこの間で止まっている 出力が「12」ならこの間で止まっている 場所を限定してから原因を考える
20 22 二分探索 コードを実行したら実行直後に死ぬようになってしまった 実行直後に死ぬのでprint文デバッグが使えない →こういう時も二分探索 int main(){ hoge(); fuga();
piyo(); hogehoge(); } こいつが死んだ int main(){ /* hoge(); fuga(); piyo(); hogehoge(); */ } すべてコメントアウト して動作確認※ int main(){ hoge(); fuga(); /* piyo(); hogehoge(); */ } 後半だけコメントアウ トして動作確認 ※「ここは絶対大丈夫」というところまで一度戻るのが大事 • ビルドに失敗しているのに気づかずに古い実行バイナリを見ていた • 間違ったライブラリをリンクしていた • そもそも実行方法を間違えていた 「ここは絶対大丈夫」がわり と大丈夫でなかったりする
21 22 AIとの付き合い方 ◯◯モデルのシミュ レーションをするコー ドを生成してください 生成されたコード 問題が起きた時に比較対象が存在しない→コードすべてを調べる必要がある 他人が書いたコードをデバッグするのは極めて困難(自分のも大変なのに) いきなりコード全体を生成させてはならない
AIの使用例 • 関数単位で生成し、その度にテストする • エラーメッセージからバグの原因を推定させる • モデルの数式をコード化させる • 自分のコードをチェックさせる • etc.
22 22 まとめ デバッグでは、まず安全地帯を確保する 「ここまでは絶対大丈夫」を確保する 大丈夫なコードとダメなコードを比較するこ とでバグがある場所を限定する デバッグでは、頭を使わない print文やコメントによる二分探索など、やる べきことを単純作業に落とす
デバッガやIDEの利用を覚えるのは、上記の基礎ができてからの方が良いと思う