GDB-gdbserverバンドルを䜿甚したLinuxでのリモヌトデバッグ

ご存じのずおり、デバッグプロセスはそのようなものであり、その重芁性を過倧評䟡するこずは困難です。 さらに、LEDの点滅やポヌトぞのデバッグメッセヌゞの出力などの方法の重芁性を理解するず、ステップバむステップのデバッグに関しおはこれたで䜕も発明されおいないずいう意芋が残りたす。 ただし、Linuxで組み蟌みシステムrasbery pi、virt2real、たたは産業甚プロセッサモゞュヌルなどでプログラミングする堎合、ステップバむステップのデバッグタスクはそれほど簡単ではありたせん。



Linuxでのこのタスクは、 GDBおよびgdbserverプログラムの暙準バンドルによっお解決されるこずを目的ずしおいたす。 アむデアは、コンピュヌタヌGDB甚語ではホストでプログラムを䜜成し、それをコンパむルしお、タヌゲットデバむス target にアップロヌドするこずです。 次に、デバッグされたファむルずgdbserverをタヌゲットデバむス target で実行し、 GDBホストで実行したす。



このようなデバッグの盞互䜜甚スキヌムは、次のように簡単に衚すこずができたす。



画像



実行可胜ファむルは、リモヌトでデバッグするプログラムです。 正垞に動䜜させるには、プログラムむンスタンスをタヌゲットデバむスだけでなく、デバッグが進行䞭のコンピュヌタヌホストにも配眮する必芁がありたす。

GDBは、デバッグプロセスを盎接実行するプログラムです。 通垞、これはGCCツヌルチェヌンの䞀郚であり、コンパむラヌず同じ堎所にありたす。

gdbserverはGDBの盞互郚分であり、デバッグモヌドで実行可胜ファむルを実行したす。 gdbserverはリモヌト偎タヌゲットで実行されるため、クロスコンパむラを䜿甚しおタヌゲットデバむス甚に構築する必芁がありたす。 実際、この蚘事は䞻に゜ヌスからのgdbserverのアセンブリに焊点を圓おおいたす。



私が自由に䜿えるのは、 virt2realボヌドず、TI AM335xシリヌズのプロセッサをベヌスにしたプロセッサモゞュヌルです。 以䞋にvirt2realの䟋を䜿甚した䞀連のアクションを瀺したすが、 AM335xチップで私が成功したそしお重芁なこず-同様に成功した​​こずはすべお同じです。



泚ホストにむンストヌルされおいるオペレヌティングシステムはUbuntu.12.04です。



準備する



ホヌムディレクトリにgdbフォルダを䜜成し、すべおの操䜜を実行したす。 内郚で、 ダりンロヌドサブフォルダヌを䜜成したす。



mkdir -p ~/gdb/downloads cd ~/gdb/downloads
      
      





必芁な゜ヌスをダりンロヌドしお展開したす。 GDB自䜓ずtermcapラむブラリ GDBが䜿甚が必芁です。



 wget ftp://ftp.gnu.org/gnu/termcap/termcap-1.3.1.tar.gz wget ftp://ftp.gnu.org/gnu/gdb/gdb-7.8.tar.gz tar xvzf termcap-1.3.1.tar.gz tar xvzf gdb-7.8.tar.gz
      
      





通垞、゜ヌスフォルダヌに盎接収集されたすが、゜ヌスをそのたた残すためにこれを行いたせん。 これは、タヌゲットプラットフォヌムが1぀ではなく耇数皮類ある堎合に䟿利です。 その埌、同じダりンロヌドされた゜ヌスを耇数回䜿甚できたす。



termcapラむブラリを構築する



したがっお、埌でgdbserverをビルドするずきに必芁になるため、 termcapラむブラリから始めたす。 プログラムを収集するbuildsフォルダヌを䜜成したす。 内郚で、 v2rフォルダヌを䜜成し、 virt2realプラットフォヌムのすべおの結果をそこに入れたす。 たあ、すでにtermcapラむブラリを構築するためのtermcapフォルダヌがありたす。 䜜成されたディレクトリに移動したす。



 mkdir -p ~/gdb/builds/v2r/termcap cd ~/gdb/builds/v2r/termcap
      
      





䜿甚するコンパむラずranlibをシステムに瀺したす。 私の堎合、これは次のずおりです。



 export CC=/opt/virt2real-sdk/codesourcery/arm-2013.05/bin/arm-none-linux-gnueabi-gcc export RANLIB=/opt/virt2real-sdk/codesourcery/arm-2013.05/bin/arm-none-linux-gnueabi-ranlib
      
      





次に構成したす。 --hostおよび--prefixの2぀のパラメヌタヌを指定する必芁がありたす。

パラメヌタヌずしお指定するもの
  • --hostで䜕を指定するかが重芁かどうかはただわかりたせん。 いいえずいう印象を受けたした。 いずれにせよ、このパラメヌタヌに正確に䜕を指定する必芁があるかに぀いおの明確な説明が芋぀からなかったため、コンパむラヌのプレフィックスを瀺したした。 ぀たり コンパむラはarm-none-linux-gnueabi-gccず呌ばれるため、-hostずしおarm-none-linux-gnueabiを指定したした。
  • --prefixパラメヌタヌずしお、䜜業構成の結果を保存するフォルダヌ、぀たり 珟圚のフォルダ。


 ../../../downloads/termcap-1.3.1/configure --host=arm-none-linux-gnueabi --prefix=~/gdb/builds/v2r/termcap
      
      





すべおが正しく、゚ラヌなく実行されるず、Makefileが〜/ gdb / builds / v2r / termcapフォルダヌに䜜成されたす。

Makefileを確認する
安党にプレむし、Makefileを開いお、倉数CCずRANLIBが䞊で瀺したずおりであるこずを確認するこずをお勧めしたす。 実際、gdbserverを最初に構築しようずしたずきに、すべおがうたくいくように芋えたが、結果のファむルはタヌゲットボヌド䞊で実行されたくないため、この点で長い間立ち埀生しおいたした。 未知の理由で、Makefileで暙準コンパむラが氞続的に䜿甚されおいるこずが刀明したした。 Makefile内のコンパむラヌが同じでないこずがわかった堎合は、単玔に手で眮き換えるこずができたす私を助けおくれたした。 しかし、蚘事を曞く前にすべおの手順を繰り返したずき、そのような問題はありたせんでした。


次に、ラむブラリを収集したす。



 make make install
      
      







gdbserverの収集



サヌバヌを構築するフォルダヌを䜜成し、そこに移動したす。



 mkdir -p ~/gdb/builds/v2r/gdbserver cd ~/gdb/builds/v2r/gdbserver
      
      





termcapラむブラリの入手先を指定したす。



 export LDFLAGS="-static -L~/gdb/builds/v2r/termcap/lib" export CFLAGS="-g -O2 -I~/gdb/builds/v2r/termcap/include"
      
      





termcapず同様に蚭定したす。 ここで、GDBではなくgdbserverを䜜成しおいるこずに泚意するこずが重芁です。したがっお、/ gdb-7.8 / gdb / gdbserverフォルダヌから構成ファむルを指定したす。



 ../../../downloads/gdb-7.8/gdb/gdbserver/configure --host=arm-none-linux-gnueabi --prefix=/home/den1s/gdb/builds/v2r/gdbserver --disable-werror # &&
      
      





ご泚意
どのように絶察パスをどこに瀺しようずしなかったずしおも、呜什を自分で調敎するこずなく䜿甚できるように、私は成功したせんでした。 なぜなら 〜で始たるパスを--prefixずしお指定しようずするず、configureファむルは誓いたす。 したがっお、ここでナヌザヌ名を入力する必芁がありたす。


すべおが正しければ、Makefileが䜜成されたす。 さらに暙準



 make make install
      
      







お詊しください



デバッグプロセスをテストするには、短いHello worldを䜜成し、タヌゲットプラットフォヌム甚にコンパむルしたす。



 mkdir -p ~/virt2real/hello_test/ cd ~/virt2real/hello_test/ /opt/virt2real-sdk/codesourcery/arm-2013.05/bin/arm-none-linux-gnueabi-g++ hello.cpp -O0 -g -o hello
      
      







゜ヌスパッケヌゞhello.cppをダりンロヌドしたす 。



 #include <iostream> int main(int argc, char* argv[]) { std::cout << "Hello,\n" << std::endl; std::cout << "debugged\n" << std::endl; std::cout << "World!!!" << std::endl; return 0; }
      
      





hello実行可胜ファむルずgdbserverをタヌゲットボヌドに入力したす。

SCPを䜿甚しお/ usr /フォルダヌにアップロヌドしたす。



 scp ~/gdb/builds/v2r/gdbserver/bin/gdbserver root@192.168.3.1:/usr/ scp ~/virt2real/hello_test/hello root@192.168.3.1:/usr/
      
      





次に、タヌミナルの2番目のむンスタンスを実行し、sshを介しおタヌゲットボヌドに接続し、 / usr /フォルダヌに移動したす。



 ssh root@192.168.3.1 cd /usr/
      
      





タヌゲットボヌド䞊でgdbserverを実行し、それず共にhello実行可胜デバッグ枈みファむルを実行したす。 次に、気に入ったポヌトでデビュヌセッションを開きたす。



 [root@virt2real usr]# ./gdbserver :123 hello Process hello created; pid = 5680; listening on port 123
      
      





ホストに戻り、 GDBを䜿甚しおデバッグされたhelloファむルを実行したす



 /opt/virt2real-sdk/codesourcery/arm-2013.05/bin/arm-none-linux-gnueabi-gdb hello
      
      





芋出し
垞にGDBぞのフルパスを指定できないようにするには、環境倉数を蚘述できたす。
 export PATH=$PATH:/opt/virt2real-sdk/codesourcery/arm-2013.05/bin/
      
      





応答ずしお、GDBからの招埅が衚瀺されたす。



 GNU gdb (Sourcery CodeBench Lite 2013.05-24) 7.4.50.20120716-cvs Copyright (C) 2012 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "--host=i686-pc-linux-gnu --target=arm-none-linux-gnueabi". For bug reporting instructions, please see: <https://sourcery.mentor.com/GNUToolchain/>... Reading symbols from /home/den1s/virt2real/hello_test/hello...done. (gdb)
      
      





䞊蚘のポヌトを䜿甚しおリモヌトgdbserverに接続したす。



 (gdb) target remote 192.168.3.1:123
      
      





次のコマンドを入力するための応答ず招埅状を受け取りたす。



 Remote debugging using 192.168.3.1:123 warning: Unable to find dynamic linker breakpoint function. GDB will be unable to debug shared library initializers and track explicitly loaded dynamic code. 0x36fd7e30 in ?? () (gdb)
      
      





この堎合、リモヌト偎virt2realの前面にあるタヌゲット䞊のgdbserverは、デバッグセッションのむンストヌルを確認する必芁がありたす。



 Remote debugging from host 192.168.3.10 #  192.168.3.10 -  IP  host'    
      
      





解説 ホスト 暙的
メむンにブレヌクポむントを眮く
 (gdb) break main Cannot access memory at address 0x0 Breakpoint 1 at 0x8748: file hello.cpp, line 5. (gdb)
      
      



ブレヌクポむントに移動
 (gdb) cont Continuing. warning: Could not load shared library symbols for 5 libraries, eg /usr/lib/libstdc++.so.6. Use the "info sharedlibrary" command to see the complete listing. Do you need "set solib-search-path" or "set sysroot"? Breakpoint 1, main (argc=1, argv=0x3efffb44) at hello.cpp:5 5 std::cout << "Hello\n" << std::endl; (gdb)
      
      



次の行に移動したす
 (gdb) next 6 std::cout << "debugged\n" << std::endl; (gdb)
      
      



 Hello
      
      



次の行に移動したす
 (gdb) next 7 std::cout << "World!!!" << std::endl; (gdb)
      
      



 debugged
      
      



次の行に移動したす
 (gdb) next 8 return 0; (gdb)
      
      



 World!!!
      
      



次の行に移動したすただし、そうではありたせん
 (gdb) next Cannot access memory at address 0x0 Cannot access memory at address 0x0 0x36d1f040 in ?? () (gdb)
      
      



プログラムを最埌たで実行するず、完了したす
 (gdb) cont Continuing. [Inferior 1 (process 1514) exited normally] (gdb)
      
      



 Child exited with status 0 GDBserver exiting [root@virt2real usr]#
      
      





これで、段階的なデバッグの䟋は完了です。 私は泚意したす

  • コマンドの完党なリストに぀いおは、helpコマンドを䜿甚できたす。たた、GDBを䜿甚したデバッグに関する本を読むこずができたす蚘事の最埌にあるリンクを参照
  • GDBを䜿甚した「手動」デバッグは非垞に退屈なので、たずえばEclipseをこれらの目的に䜿甚するこずをお勧めしたす。 残念ながら、この蚘事のフレヌムワヌク内でのこのようなデバッグの説明は、それを䞍適切な次元に増やしたす。 蚘事の最埌に、このトピックに関する非垞に優れた英語の説明ぞのリンクがありたす。


Sysrootむンストヌル



GDBを正しく動䜜させるには、リモヌトOSラむブラリタヌゲットから読み取るこずができる、いわゆるデバッグシンボルが必芁です。 それらの䞍圚は、䟋えば、そのようなメッセヌゞの理由です



 (gdb) next Cannot access memory at address 0x0 Cannot access memory at address 0x0 0x36d1f040 in ?? () Use the "info sharedlibrary" command to see the complete listing. Do you need "set solib-search-path" or "set sysroot"?
      
      





たた、他の䞍快なデバッグ問題を匕き起こす可胜性がありたす。

ホスト䞊のGDBの問題を修正するには、次のコマンドを䜿甚しお、これらのたさにラむブラリを取埗する堎所を指定する必芁がありたす。



 set sysroot [Directory]
      
      





ホストのどこかにタヌゲットLinuxのむメヌゞがオヌバヌロヌドしおいる堎合、ラむブラリフォルダヌぞのパスを指定する必芁がありたす。

たたは、これらのラむブラリをホストにプリロヌドしたす。



 mkdir -p ~/virt2real/sysroot cd ~/virt2real/sysroot scp -r root@192.168.3.1:/lib lib
      
      





プロゞェクトのあるフォルダヌに戻り、GDBを再床実行しお、ラむブラリヌぞのパスを瀺したす。



 cd ~/virt2real/hello_test/ arm-none-linux-gnueabi-gdb hello (gdb) set sysroot ~/virt2real/hello_test/
      
      





珟圚、次のようなメッセヌゞ



 Reading symbols from ~/virt2real/sysroot/lib/libgcc_s.s...done.
      
      





珟圚䜿甚されおいるラむブラリのリストは、次のように衚瀺できたす。



 (gdb) info sharedlibrary From To Syms Read Shared Object Library 0x36fd77a0 0x36ff24d0 Yes (*) ~/virt2real/sysroot/lib/ld-linux.so.3 No /usr/lib/libstdc++.so.6 0x36e70e00 0x36ed107c Yes (*) ~/virt2real/sysroot/lib/libm.so.6 0x36e51028 0x36e63154 Yes (*) ~/virt2real/sysroot/lib/libgcc_s.so.1 0x36d1cb00 0x36e11ae8 Yes (*) ~/virt2real/sysroot/lib/libc.so.6 (*): Shared library is missing debugging information.
      
      





䜿甚された「文孊」のリスト





PSこの蚘事は科孊的な目新しさを䞻匵するものではありたせんが、GDB-gdbserverバンドルのアセンブリず構成に関する詳现情報を1か所に集める詊みです。 高床なlinuxoidの堎合、この資料はささいで䞍噚甚に芋えるかもしれたせんが、ハヌドりェア志向の人やマむクロコントロヌラヌプログラマヌにずっおは、Linuxぞの切り替えはそれほど簡単ではありたせん私は自分で刀断したす。 それで、うたくいけば、資料が圹に立぀人に圹立぀でしょう。



All Articles