More Related Content
Similar to センパイ!このプログラムクラッシュするんですけど。。。 (20)
センパイ!このプログラムクラッシュするんですけど。。。
- 39. データ競合の例
#include <pthread.h>
int global;
void *thread1(void *x) {
global++;
return NULL;
}
void *thread2(void *x) {
global--;
return NULL;
}
(continued..)
int main() {
pthread_t t[2];
pthread_create(&t[0], NULL,
thread1, NULL);
pthread_create(&t[1], NULL,
thread2, NULL);
pthread_join(t[0], NULL);
pthread_join(t[1], NULL);
}
- 40. データ競合の例
#include <pthread.h>
int global;
void *thread1(void *x) {
global++;
return NULL;
}
void *thread2(void *x) {
global--;
return NULL;
}
(continued..)
int main() {
pthread_t t[2];
pthread_create(&t[0], NULL,
thread1, NULL);
pthread_create(&t[1], NULL,
thread2, NULL);
pthread_join(t[0], NULL);
pthread_join(t[1], NULL);
}
- 59. std::unique_ptr
#include <memory>
int main() {
auto a= new int( 123);
// `new`したら明示的に`delete`
delete a;
}
#include <memory>
int main() {
auto a =
std::make_unique<int>( 123 );
} // `std::unique_ptr`は
// スコープの終わりで自動的に開放される
- 61. std:: shared_ptr
int main() {
std::shared_ptr<Hoge> sp1(nullptr);
{
auto sp2 = make_shared<Hoge>();
sp1 = sp2;
assert(sp1.use_count() == 2);
} // sp2が解放され、参照カウントが1下がる
assert(sp1.use_count() == 1);
} // sp1が解放され、ヒープに確保したオブジェクトが解放される
Editor's Notes
- デバッグの理論と実践より。
欠陥(defect):
コンポーネント又はシステムに要求された機能が実現できない原因となる、コンポーネント又はシステムに含まれる不備。
たとえば、不正なステートメント又はデータ定義。実行中に欠陥に 遭遇した場合、コンポーネント又はシステムの故障を引き起こす。
バグ
障害に関係する、とりのぞける何か。
定義があいまい
欠陥
不正なプログラムコード
コードに含まれるバグ
感染
不正なプログラム状態
状態に含まれるバグ
障害
外部から観察できる、不正なプログラムの動作
動作に含まれるバグ
- バグが発生する原因は多くの場合、不正なプログラムコードが原因なわけなのですが、
我々が時折出くわすデバッグが困難な状態、それは「不正な挙動から、どこが不正なプログラムなのか割り出しにくい」という
場合になると考えられます。
実際、不正なプログラムは、それが原因で不正なメモリ状態やデータを作り出し、それが不正な動作を生み出すのです。
今回の話では、これらを区別して話を進めていきたいと思います。
ちなみに「デバッグの理論と実践」では、これらをそれぞれ「欠陥」「感染」「障害」と呼んでいます。
※「欠陥」「感染」「障害」の用語を定義する意義を同時に説明してしまうとよいかと思いました。
(用語の定義だけポンと出されても、聞いている人は忘れてしまうものです。)
- 障害との遭遇
障害の記録(バグチケット作成)
障害の再現(!)
欠陥の特定
再現できたら
再現条件の絞り込み(エンバグリビジョン特定 git bisect, 再現手順の短縮 e.t.c.)
仮説検証しながら感染経路を特定する
再現できなかったら?
ダンプファイルを使った事後デバッグ
欠陥箇所の推定(クラッシュログ、コードレビュー、解析ツール e.t.c.)
欠陥の除去
- センパイとコウハイ
コウハイとセンパイはバグを埋め込み、バグを取り除く関係
コウハイは知識・経験・技術を吸収し、早くセンパイになる
センパイはコウハイをフォローすることで間接的にバグの総数を減らす
デバッグが難しい障害への対応
設計、テスト、コードレビューで予防するのが現実的
解析ツールがあればベター
コウハイへのフォローは予防の時点で行い、こういう欠陥を埋め込ませない