Android環境でのGDBデバッグ

4358 ワード

基本概念
gdbはGNUが開発したLinux/Unix環境でのプログラムのデバッグツールである.ターゲットシステムのリソースを節約するために、gdbは通常gdb+gdbserver方式でデバッグされる.
Android GDBデバッグシーンでは、gdbはPC側で実行され、gdbserverはAndroidシステムで実行されます.実際のデバッグ中、PC側のgdbはデバッグシンボルファイルを参照してgdbserverにコマンドを発行し、gdbserverは実行プログラムに信号を送信し、Androidシステムの実行プログラムの追跡と制御を実現する.
  • は、まだC/C++プログラムを実行していないか、または実行中のC/C++プログラム
  • にバインドする.
  • デバッグされたプログラムを指定されたブレークポイントで
  • の実行を中止する.
  • 現在の中止状態におけるペアスタック、ローカル変数などの情報
  • を表示する.
  • 変数に値を付与、関数を呼び出すなどの操作によりプログラムの実行環境を動的に変更する
  • .
    デバッグ環境の準備
  • gdb gdbは、通常Androidソースのprebuiltディレクトリの下にあるPC側で動作します.異なるプロジェクト、異なるプラットフォーム、gdbの位置は異なるかもしれませんが、prebuiltディレクトリに入る下でfindコマンドで検索できます:find./-name"gdb",一般的な経路は以下の通りである:prebuilts/gdb/linux-x 86/bin/gdb prebuilts/gcc/linux-x 86/aarch 64/aarch 64-linux-android-4.9/bin/aarch 64-linux-android-gdb
  • gdbserver gdbserverはAndroidシステムで実行され、デフォルトではengまたはuserdebugのソフトウェアバージョンにインストールされています.gdbserverは、デバッガの実行ビット数(32ビット/64ビット)に応じて、一致するバージョンgdbserver/gdbserver 64を選択する必要があります.注意:携帯電話にgdbserverが見つからない場合は、ソースprebuiltディレクトリのgdbserverを携帯電話に
  • インストールできます.
  • デバッグシンボル情報を持つファイルC/C++プログラムをデバッグするには、デバッグシンボル情報が必要です.Androidソースコードのコンパイル規則に従って、デバッグシンボル情報は通常、ディレクトリout/target/product/[PRODUCT_NAME]/sysmbolsの下にある.デバッグ中により多くのデバッグ情報を取得できるように、ソースコードをフル編集し、デバッグ対象のAndroid.mkでコンパイル最適化を閉じる:LOCAL_CFLAGS+=-O 0-g//-O 0:最適化レベル0、-g:デバッグ
  • を開く
    デバッグの例
    メディアサーバプロセスを例に挙げる.
    Step 1. gdbserverを起動し、mediaserverのプロセスにバインドします.
    adb shell gdbserver :8888 --attach 1232
    

    注意:a.gdbserverを使用するか、gdbserver 64を使用するかは、プロセスのビット数に基づいて決定する必要があります.プロセスの桁数はfileコマンドで表示できます.
    adb shell file system/bin/mediaserver                                                                                                                          
    

    b.1232はプロセスidであり、psコマンドで表示することができる.
    adb shell ps -ef | grep mediaserver
    

    c.プロセスidをバインドしない場合、gdbserverは新しいプロセスを再作成します.
    adb shell gdbserver :8888 system/bin/mediaserver
    

    作成したメディアサーバは、システムの起動方法に比べてgroup、selinux context情報が失われます.したがって、システムがデバッグプロセスを開始した場合、指定したPIDに直接バインドできます.gdbserverによって新しいプロセスを作成することを考慮することができます.
    Step 2. PC指定ポートをAndroidシステムの指定ポートにマッピング
    adb forward tcp:8888 tcp:8888
    

    Step 3. PC側起動gdbクライアント
    prebuilts/gdb/linux-x86/bin/gdb out/target/product/[PRODUCT_NAME]/symbols/system/bin/mediaserver
    

    Step 4. デバッグシンボルファイルを含むsymbolsパスを指定する
    (gdb) set solib-absolute-prefix out/target/product/[PRODUCT_NAME]/symbols/
    (gdb) set solib-search-path out/target/product/[PRODUCT_NAME]/symbols/
    

    Step 5. gdbと起動したgdbserverをtcp/portで接続
    (gdb)target remote :8888
    

    Step 6. 各種ポーズの調整を開始
    1.デバッガの情報を表示する
    (gdb) info thread:           thread  
    (gdb) info breakpoints [n]             (   n)   
    (gdb) info watchpoints [n]              (    n)   
    (gdb) info program                    
    (gdb) info args                       
    (gdb) info locals                         
    (gdb) info display         display           
    (gdb) info frame             ,      
    (gdb) print a      a  
    (gdb) print &a     a   
    

    2.スレッド情報のデバッグ
    (gdb) thread:     gdbserver    thread  
    (gdb) thread [Id]:      Id thread
    

    3.スタック情報デバッグ
    (gdb) bt full          
    

    4.現在実行中のソース情報を表示する
    (gdb) ctrl + x + a (full) :        ,                     
    (gdb) up/down:            /        
    

    4.プログラムのワンステップ実行/継続実行制御/終了実行
    (gdb) c         /      
    (gdb) n     
    (gdb) quit     
    

    5.ブレークポイント情報のデバッグ
    (gdb) b(reak) filename:linenumber           ;          
    (gdb) b(reak) filename:function              ;          
    

    6.観察点情報のデバッグ
    (gdb) watch *(long *)0x7777777        long    ,      ,    
    (gdb) rwatch *(long *)0x7777777         long    ,        ,    
    (gdb) awatch *(long *)0x7777777            ,          ,    
    

    7.運転環境のデバッグの変更
    (gdb) print x = 4       C/C++  ,   x     4 
    (gdb) jump +num                num     
    (gdb) jump linenum               linenum      
    (gdb) jump file:linenum        file linenum     
    (gdb) singal SIGNAL           SINGAL      
    (gdb) return             ,         
    (gdb) return result               result,        
    (gdb) call func