gdbとlldbの使用
プログラムをステップ実行します
「gdbとlldbの使用」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
対話型デバッガー
gdb(GNU)と lldb(LLVM)を使うと、実行中のプログラムを一時停止し、変数を調べ、コードを1行ずつ実行できます。両者のコマンドは似ています。
デバッグ情報付きでコンパイルする
デバッガーが機械語をソースコードに対応付けられるように、必ず -g(できれば -O0 も)を付けてビルドしてください。
g++ -g -O0 main.cpp -o app
# then
gdb ./appブレークポイントの設定
ブレークポイントを設定すると、選択した場所で実行を一時停止できます。
- gdb:
break main.cpp:10またはbreak myFunc - lldb:
breakpoint set --file main.cpp --line 10またはb myFunc
プログラムの実行
run(または r)で実行を開始します。プログラムは最初に到達したブレークポイントで停止し、調査できる状態になります。
コードをステップ実行する
基本的なステップ実行コマンド(gdb と lldb で同じ名前です):
next/n:呼び出しの中には入らず、1行実行しますstep/s:呼び出しの中に入って実行しますfinish:現在の関数が戻るまで実行しますcontinue/c:次のブレークポイントまで実行を再開します
変数の調査
値を表示して、プログラムの状態を把握します。
- gdb:
print x、print arr[2] - lldb:
frame variableまたはp x
セッション例の対象
次のプログラムを考えてみましょう。ループで停止し、反復ごとに sum を表示するとよいでしょう。
#include <iostream>
int main() {
int sum = 0;
for (int i = 1; i <= 3; ++i) {
sum += i;
}
std::cout << sum << "\n";
return 0;
}コールスタック
停止中に backtrace(gdb)または bt(lldb)を使うと、関数呼び出しの連鎖が表示されます。frame N で呼び出し元のフレームに切り替え、そのローカル変数を調べられます。
ウォッチポイント
ウォッチポイントを設定すると、変数が変更されたときにプログラムが停止するため、予期しない変更が発生した場所を見つけやすくなります。
- gdb:
watch counter - lldb:
watchpoint set variable counter
条件付きブレークポイント
条件が成立したときだけ停止することで、手動でステップ実行する手間を省けます。
- gdb:
break loop.cpp:5 if i == 99 - lldb:
breakpoint set --line 5 --condition "i == 99"
クラッシュのデバッグ
クラッシュするプログラムをデバッガー上で実行すると、セグメンテーション違反が発生した行で停止します。その後 bt を使って、そこに至った経路を確認できます。後からコアダンプを解析することもできます。
クイックチェック
ステップ実行のコマンドを思い出してください。
まとめ
対話型デバッグについて学びました。
-g -O0を付けてビルドします- ブレークポイントを設定し、
runの後にnext/step/finishを使います print/frame variableとbacktraceで調査します- ウォッチポイントと条件付きブレークポイントで、見つけにくいバグを追跡します
よくある質問
「gdbとlldbの使用」レッスンは無料ですか?
はい。「gdbとlldbの使用」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「gdbとlldbの使用」で何を学びますか?
プログラムをステップ実行します ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「gdbとlldbの使用」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- gdbとlldbの使用
- AddressSanitizer
- UBSanとTSan
- Valgrindの基礎