最終更新
リンドくん
たなべ先生、C++のプログラムでセグフォって出るんですけど、どこでエラーが起きてるのか全然わからないです...
たなべ
あー、セグメンテーションフォルトね!
確かに最初はどこで問題が起きているのかわからなくて困るよね。でも大丈夫、gdbやlldbというデバッガを使えば、エラーの場所をピンポイントで特定できるんだよ。
C++でプログラミングを学んでいると、必ず遭遇するのが「セグメンテーションフォルト」や予期しない動作などのバグです。
特に初心者の方は、エラーメッセージを見ても「一体どこで何が起きているのか」がわからず、途方に暮れることも多いのではないでしょうか?
そんな時に強力な助けとなるのが、gdb(GNU Debugger)とlldb(LLVM Debugger)というデバッガツールです。
これらのツールを使いこなすことで、バグの原因を素早く特定し、効率的に修正できるようになります。
この記事では、C++のデバッグで悩んでいる初心者の方に向けて、gdbとlldbの基本的な使い方から実践的なデバッグテクニックまで、わかりやすく解説していきます。
HackATAは、エンジニアを目指す方のためのプログラミング学習コーチングサービスです。 経験豊富な現役エンジニアがあなたの学習をサポートします。
✓ 質問し放題
✓ β版公開中(2025年内の特別割引)
リンドくん
そもそもデバッガって何をするツールなんですか?
たなべ
デバッガは、プログラムの実行を制御しながら内部の状態を確認できるツールなんだ。
まるで時間を止めて、プログラムの中身を覗き見ることができる魔法のツールだと思ってもらえればいいよ。
デバッガとは、プログラムの実行中に以下のことができる強力なツールです。
これらの機能により、「なぜプログラムが思った通りに動かないのか」を詳細に分析できるのです。
多くの初心者が最初に行うのが「printfデバッグ」または「coutデバッグ」と呼ばれる方法です。
これは、プログラムの各所に出力文を挿入して動作を確認する方法ですが、以下のような問題があります。
一方、デバッガを使えば、コードを一切変更することなく、必要な情報を必要な時に確認できます。
デバッガを効果的に使用するには、まずデバッグ情報付きでコンパイルする必要があります。
コンパイルコマンド
-g
オプションが重要で、これによりデバッグ情報がバイナリファイルに埋め込まれます。
デバッガで最低限覚えておきたいコマンドは以下の通りです。
プログラムの実行制御
run
(両方共通)/ process launch
(lldb) → プログラムを実行continue
(両方共通) → 実行を継続quit
(両方共通) → デバッガを終了ブレークポイント関連
break 行番号
(gdb)/ breakpoint set --line 行番号
(lldb) → ブレークポイント設定info breakpoints
(gdb)/ breakpoint list
(lldb) → ブレークポイント一覧表示ステップ実行
step
(両方共通) → 1行ずつ実行(関数内部にも入る)next
(両方共通) → 1行ずつ実行(関数呼び出しはスキップ)リンドくん
実際にバグが起きた時は、どういう手順でデバッグすればいいんですか?
たなべ
いい質問だね!
効率的なデバッグには系統立ったアプローチが大切なんだ。段階的に問題を絞り込んでいく方法を教えるよ。
まず、プログラムがクラッシュする場合は、その場所を特定しましょう。
lldbでの例
この情報から、7行目でBAD_ACCESSが発生していることがわかります。
エラー発生時点での変数の状態を確認します。
問題の箇所にブレークポイントを設定して、段階的に実行します。
条件付きブレークポイント
ウォッチポイント
配列でよく発生する問題です。
症状: セグメンテーションフォルトまたは予期しない値(範囲外に変な値が入る)
効率的な開発のためには、以下のワークフローを実践することをおすすめします。
多くの統合開発環境(IDE)では、gdbやlldbとの連携機能が提供されています。
これらのツールを使うことで、グラフィカルな interface でデバッガを操作でき、初心者でも扱いやすくなります。
最初から完璧を目指さない
ログと組み合わせる
チーム開発での活用
リンドくん
デバッガって最初は難しそうに見えましたけど、意外と使いやすそうですね!
たなべ
そうなんだ!最初の一歩が踏み出せれば、デバッガは君の最強の味方になってくれるよ。
特にC++みたいなシステムレベルの言語では、デバッガなしの開発は考えられないからね。
C++のデバッグにおいて、gdbとlldbはプログラマにとって必須のスキルです。
最初は複雑に感じるかもしれませんが、基本的なコマンドから始めて徐々に習得していけば、必ず身につけることができます。
今回学んだ重要なポイントをまとめましょう。
デバッガを使いこなすことで、開発効率は格段に向上し、より高品質なC++プログラムを作成できるようになります。
「バグが怖い」から「バグも楽しい!」と思えるようになれば、あなたのプログラミングスキルは大きく飛躍するでしょう。