モバイル開発におけるDebug — その概要、デバッグモード、仕組み

著者: IT Sectr 公開日: 2026-05-06 読了時間: 8 分

Debug(デバッグモード)— これはモバイルアプリケーションのビルド設定で、コンパイラがシンボル情報を含め、コード最適化を無効にし、ステップごとの実行分析のためにデバッガを接続します。Android Developersによると、Debugビルドにはデバッグシンボルが含まれ、リソースを圧縮せず、データベースインスペクタやネットワークリクエストインスペクタを接続できます。DebugモードはReleaseビルドと対照的です:Debugでは開発者はコード実行の透明性のためにパフォーマンスを犠牲にします。

主要ポイント

  • Debug — デバッグ情報、最適化無効、デバッガアクセスを備えたビルド設定
  • デバッガはブレークポイントの設定、変数の表示、コードのステップ実行を可能にします
  • Debugビルドはデバッグ証明書で署名され、アプリストアに公開できません
  • LLDBはiOS/macOSの主要デバッガであり、Android StudioのLLDBはAndroid用です
  • パフォーマンスはDebugビルドの方がコンパイラ最適化がないためReleaseより低い

モバイル開発におけるDebugモードとは

Debugは単なるコンパイラフラグではなく、アプリケーションを開発者にとって透過的にする設定の完全なセットです。Debugモードでは、コンパイラが実行可能ファイルにシンボル名テーブル(DWARF)を追加し、マシンコードをソース行にリンクします。このテーブルがないと、デバッガは現在どのコード行が実行されているかを表示できません。

デバッガ(debugger)は、制御された環境でアプリケーションを実行するプログラムです。任意の行で実行を一時停止し(ブレークポイント)、現在のスコープ内のすべての変数の値を表示し、その場で変更し、実行を続行できます。モバイルプラットフォームの標準デバッガはLLDBです—XcodeとAndroid Studioの両方で使用されるLLVMコンポーネントです。

Debugモードには、Releaseでは無効になっている追加のチェックも含まれます:アサーション、配列境界チェック、メモリリーク検出器、拡張ロギング。これらのチェックはアプリケーションを遅くしますが、開発の初期段階でエラーを検出します—コードがユーザーに届く前に。

DebugとRelease:ビルドの主な違い

DebugビルドとReleaseビルドの違いは根本的です:コンパイラフラグ、署名設定、パッケージング設定の2つの異なるセットです。これらの違いを理解することで、“シミュレータでは動くが実機では動かない”という状況を避けることができます。

パラメータDebugRelease
最適化無効 (-O0)有効 (-Os または -O2)
シンボル完全なDWARFテーブル削除済み
署名開発証明書配布証明書
プロファイルDebugプロビジョニングプロファイルApp Store / Ad Hocプロファイル
ロギング完全(全レベル)無効または最小限
難読化無効有効 (ProGuard/R8)
.apk/.ipaサイズ大(シンボル+圧縮なし)小 (R8 + リソース)

それぞれの使用タイミング

Debugビルドは開発とローカルデバイスでのテストの全段階で使用されます。ReleaseビルドはApp Store ConnectまたはGoogle Play Consoleに送信する前に生成されます。Releaseビルドでのデバッグは技術的に可能ですが、メソッド名の変更(R8)やクラッシュログのsymbolication不足により非常に不便です。

モード切り替えの問題

よくある問題は、Debugでは動作するがReleaseではクラッシュするコードです。原因は、コンパイラが最適化レベルによって異なる方法で処理するコード内のUB(未定義動作)です。典型的な例:未初期化変数の読み取りやstrict aliasing違反。このようなエラーを検出するには、各Releaseビルドの前に静的アナライザ(Clang Static Analyzer、ktlint)を使用してください。

デバッグツール:LLDB、ブレークポイント、インスペクタ

LLDBはLLVMベースの高性能デバッガで、C、C++、Objective-C、Swift、Kotlin/Nativeをサポートします。LLDBはREPLインターフェースを提供し、一時停止したアプリケーションのコンテキストで任意の式を実行したり、変数値を変更したり、関数を呼び出したりできます。

ブレークポイントとその種類

ブレークポイントはデバッガの主要ツールです。コードの行にポイントを設定すると、実行がその行に達したときにアプリケーションが一時停止します。LLDBはいくつかのタイプのブレークポイントをサポートしています:条件付き(条件が満たされた場合のみトリガー)、シンボリック(関数呼び出し時)、ワンショット(1回トリガーして自動的に削除)。

ウォッチポイントとメモリインスペクタ

ウォッチポイントは変数の変更を監視するポイントです。メモリアドレスを指定すると、デバッガはそのアドレスへの書き込み時に実行を一時停止します。このツールはデータ競合や共有オブジェクトの誤った変更を見つけるのに不可欠です。UIKit階層を表示するには、Xcodeで利用可能なUIView Inspectorを使用してください。

lldb
// 条件付きブレークポイントの設定
(lldb) breakpoint set --name "viewDidLoad" --condition "self.isViewLoaded == false"

// プロパティのウォッチポイント
(lldb) watchpoint set variable self->_loadingState

// 停止コンテキストでのコード実行
(lldb) expr self.view.backgroundColor = UIColor.redColor

XcodeとAndroid Studioのインスペクタ

両方のIDEはLLDB上にグラフィカルインスペクタを提供します。Android StudioにはLayout Inspector(View階層)、Network Inspector(HTTPリクエストトレース)、Database Inspector(リアルタイムSQLite)が含まれます。XcodeはDebug Memory Graph(メモリリーク分析)とView Debugger(UIKitレイヤーの3Dビュー)を提供します。

リモートデバッグとWi-Fiデバッグ

Android 11以降、Wi-Fi経由のデバッグはUSB接続なしで動作します:Android StudioからQRコードをスキャンするだけです。iOSはXcode 9+からWi-Fiデバッグをサポートしています—デバイスは一度USB経由で接続し、その後デバッグセッションはネットワーク経由で実行できます。Wi-Fiデバッグは予測不能なレイテンシとパケットロスのためCIサーバーには適していないため、自動化パイプラインは常にUSBを使用します。ただし、ローカル開発ではWi-Fiデバッグの方がはるかに便利です—開発者はケーブルに縛られず、部屋の反対側にあるデバイスでアプリケーションをテストできます。

AndroidでのDebug:Android StudioとADBデバッグ

Android Debug Bridge(ADB)はコマンドラインからAndroidデバイスと対話するための汎用ツールです。ADBを介してアプリケーションのインストール、デバッグの開始、ファイルのコピー、shellコマンドの実行、ログの表示ができます。Android Studioはすべてのデバッグ操作で内部的にADBを使用します。

Android Studioでのデバッガ接続

Android Studioは2つのデバッグモードをサポートしています:Run(通常起動)とDebug(デバッガ接続起動)。Debugモードでは、エディタで直接ブレークポイントを設定し、Debug Tool Windowで変数を検査し、Evaluate Expressionで式を評価できます。バックグラウンドプロセス(Service、BroadcastReceiver)をデバッグするには、Attach Debugger to Android Processを使用します。

kotlin
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // ここでのブレークポイントは実行を一時停止します
        val button = findViewById<Button>(R.id.btn_debug)
        button.setOnClickListener {
            startDebugProcess()
        }
    }

    private fun startDebugProcess() {
        val data = fetchDataFromApi()
        Log.d("Debug", "Data loaded: $data")
    }
}

ADB shellとデータベース検査

ADB shellコマンドはroot権限なしでデバイスのファイルシステムにアクセスできます。databasesディレクトリの内容を表示し、.dbファイルをコンピュータにコピーし、任意のSQLiteクライアントで開くことができます。Android Studio Database Inspectorはこのプロセスを自動化します:リアルタイムでライブデータベースデータを表示し、IDEから直接SQLクエリを実行できます。

iOSでのDebug:Xcode、デバッガ、診断

XcodeはLLDBベースの統合デバッグ環境を提供します。開発者はシミュレータまたは実機でアプリケーションを実行し、ブレークポイントを設定し、Debug Navigatorを使用して実行スレッドを制御できます。Androidとは異なり、iOSは特別な設定なしに同じデバイスで2つのDebugビルドを同時に実行できません。

シミュレータと実機でのデバッグ

シミュレータはアプリケーションをネイティブmacOSプロセスとして実行し、最速のデバッグサイクルを提供します。実機では、デバッグはUSBまたはWi-Fi(iOS 16以降)経由で行われ、LLDBはデバイス上のdebugserverと通信します。USB 2.0の帯域幅制限により実機でのデバッグパフォーマンスは低くなりますが、実機のみが実際のシナリオ(プッシュ通知、カメラ、センサー)をテストできます。

swift
import UIKit

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        setupUI()
    }

    private func setupUI() {
        let label = UILabel()
        label.text = "デバッグモード"
        label.textColor = .systemBlue
        view.addSubview(label)
    }
}

診断とクラッシュレポート

Xcode OrganizerはCrash Logsを介してテスターのデバイスからクラッシュログを収集します。symbolication(アドレスを関数名に変換)には.dSYMファイルが必要で、これは各Debugビルドで生成されます。ReleaseビルドでもdSYMは作成されますが、App Storeからのクラッシュログは手動またはbitcodeサービスを介してOrganizerにアップロードする必要があります。

よくある質問

ユーザーのデバイスでDebugビルドを実行できますか?

技術的にははい—Debug証明書によるAd Hoc配布を通じて可能ですが、AppleとGoogleはこれを推奨していません。Debugビルドにはデバッグシンボルと低いパフォーマンスが含まれ、UXを低下させ、アプリケーションサイズを2–3倍に増加させます。

DebugビルドがReleaseより遅いのはなぜですか?

理由はコンパイラ最適化が無効になっていることです(-O0)。コンパイラは関数をインライン化せず、デッドコードを削除せず、すべての中間変数を保持します。さらに、DebugにはReleaseにはないアサーションチェックと配列境界チェックが含まれます。

iOSのWi-Fiデバッグを設定する方法は?

XcodeでWindow → Devices and Simulatorsを選択し、デバイスに対して“Connect via network”にチェックを入れます。デバイスとMacが同じWi-Fiネットワーク上にある必要があります。一度USB経由で接続すると、以降の起動ではデバッグがWi-Fi経由で動作します。

Android Studioの“attach to process”とは?

Attach to processは、アプリケーションを再起動せずに既に実行中のプロセスにデバッガを接続できます。これは、標準のDebug Runが適用できないService、BroadcastReceiver、またはシステムイベントで起動されるプロセスのデバッグに便利です。

ReleaseビルドでNSLogとprintを表示する方法は?

NSLogとprintはデフォルトではDebug設定でのみログを出力します。Releaseでは、OSLogType.defaultフラグを指定してos_logを使用してください— Unified Logging Systemにメッセージを保存し、MacのConsole.appからアクセスできます。

まとめ

  • Debugビルドはデバッグシンボルを含み、最適化を無効にし、開発署名証明書を使用します
  • LLDBは両プラットフォームの主要デバッガで、ブレークポイント、ウォッチポイント、REPLをサポート
  • DebugとReleaseの違いは最適化、シンボル、署名、難読化、ビルドサイズに影響
  • AndroidのADBiOSのdebugserverがIDE-デバイス間通信を提供
  • Debugビルドのパフォーマンスは最適化無効により2–5倍低い
  • クラッシュログはDebugビルドで読み取り可能な関数名を含み、ReleaseではdSYMによるsymbolicationが必要

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください