私はbeaglebone black用のアプリケーションを開発しています。 arm gccコンパイラを使用してクロスコンパイルし、scp
コマンドを使用してコンパイルされたバイナリをbeaglebone blackに移植し、ボード上で実行します。
アプリケーションはしばらく完全に実行されていましたが、後で分割エラーが発生しました。いくつかの調査を行った後、デバッグを使用できることがわかりましたが、ボードにインストールする方法、またはホストシステムを使用してデバッグする他の方法が何であるかという問題gdb
に直面しました。gdb
gdbserver
分割エラーをデバッグするのに役立ちます。
答え1
まず、cross-gdbが必要です。これを行うには、gdbソースコードをダウンロードして解凍して実行し、通常./configure --target=arm-linux-gnueabi
どおりに進みますmake; make install
。これでインストールが完了したはずですgdb-linux-gnueabi
。走る。 beagleboneで実行しますgdbserver 0.0.0.0:1234
。 cross-gdbを実行しているマシンでtarget remote 192.168.12.34:1234
BBBのIPアドレスに置き換えるコマンドを入力します。これで、通常どおり gdb セッションを使用できるようになります。
ただし、いくつかの注意事項があります。
- プロセスを開始しようとせず、代わりに "continue"(または "c")コマンドを使用してください。
- デバッグ中のプロセスを終了すると
gdbserver
終了します。別のセッションを実行するには、再起動するだけです。 gdbはブレークポイントなどを覚えています。ただし、target remote
コマンドを再実行する必要があります。 - Gdbserverは、デバッグされたプログラムのイメージをgdbに送信しません。これを直接行う必要があります。個人的に最も簡単な方法はNFSを使用することだと思います。
答え2
ターゲットビーグルボーンブラックから次のような回答を受けました。
Remote debugging from host 192.168.1.1
[getpkt: discarding char '+']
getpkt ("qSupported:multiprocess+;xmlRegisters=i386;qRelocInsn+"); [sending ac
[sent ack]
putpkt ("$PacketSize=3fff;QPassSignals+;QProgramSignals+;qXfer:libraries-svr4:r]
[received '+' (0x2b)]
getpkt ("QStartNoAckMode"); [sending ack]
[sent ack]
[noack mode enabled]
putpkt ("$OK#9a"); [noack mode]
[getpkt: discarding char '+']
getpkt ("Hgp0.0"); [no ack sent]
putpkt ("$OK#9a"); [noack mode]
getpkt ("qXfer:features:read:target.xml:0,fff"); [no ack sent]
putpkt ("$l<?xml version="1.0"?>
<!-- Copyright (C) 2009-2012 Free Software Foundation, Inc.
*!Copying and distribution of this file, with or without modification,
*!are permitted in any medium without royalty provided the copyright
*!notice and this notice are preserved. -->
<!DOCTYPE target SYSTEM "gdb-target.dtd">
<target>
<xi:include href="arm-core.xml"/>
<xi:include href="arm-vfpv3.xml"/>
<feature name="org.gnu.gdb.arm.neon"/>
</target>
#b0"); [noack mode]
getpkt ("qXfer:features:read:arm-core.xml:0,fff"); [no ack sent]
putpkt ("$l<?xml version="1.0"?>
<!-- Copyright (C) 2007-2012 Free Software Foundation, Inc.
*!Copying and distribution of this file, with or without modification,
*!are permitted in any medium without royalty provided the copyright
*!notice and this notice are preserved. -->
<!DOCTYPE feature SYSTEM "gdb-target.dtd">
<feature name="org.gnu.gdb.arm.core">
<reg name="r0" bitsize="32" type="uint32"/>
<reg name="r1" bitsize="32" type="uint32"/>
<reg name="r2" bitsize="32" type="uint32"/>
<reg name="r3" bitsize="32" type="uint32"/>
<reg name="r4" bitsize="32" type="uint32"/>
<reg name="r5" bitsize="32" type="uint32"/>
<reg name="r6" bitsize="32" type="uint32"/>
<reg name="r7" bitsize="32" type="uint32"/>
<reg name="r8" bitsize="32" type="uint32"/>
<reg name="r9" bitsize="32" type="uint32"/>
<reg name="r10" bitsize="32" type="uint32"/>
<reg name="r11" bitsize="32" type="uint32"/>
<reg name="r12" bitsize="32" type="uint32"/>
<reg name="sp" bitsize="32" type="data_ptr"/>
<reg name="lr" bitsize="32"/>
<reg name="pc" bitsize="32" type="code_ptr"/>
<!-- The CPSR is register 25, rather than register 16, because
*" the FPA registers historically were placed between the PC
*" and the CPSR in the "g" packet. -->
<reg name="cpsr" bitsize="32" regnum="25"/>
</feature>
#13"); [noack mode]
getpkt ("qXfer:features:read:arm-vfpv3.xml:0,fff"); [no ack sent]
putpkt ("$l<?xml version="1.0"?>
<!-- Copyright (C) 2009-2012 Free Software Foundation, Inc.
*!Copying and distribution of this file, with or without modification,
*!are permitted in any medium without royalty provided the copyright
*!notice and this notice are preserved. -->
<!DOCTYPE feature SYSTEM "gdb-target.dtd">
<feature name="org.gnu.gdb.arm.vfp">
<reg name="d0" bitsize="64" type="ieee_double"/>
<reg name="d1" bitsize="64" type="ieee_double"/>
<reg name="d2" bitsize="64" type="ieee_double"/>
<reg name="d3" bitsize="64" type="ieee_double"/>
<reg name="d4" bitsize="64" type="ieee_double"/>
<reg name="d5" bitsize="64" type="ieee_double"/>
<reg name="d6" bitsize="64" type="ieee_double"/>
<reg name="d7" bitsize="64" type="ieee_double"/>
<reg name="d8" bitsize="64" type="ieee_double"/>
<reg name="d9" bitsize="64" type="ieee_double"/>
<reg name="d10" bitsize="64" type="ieee_double"/>
<reg name="d11" bitsize="64" type="ieee_double"/>
<reg name="d12" bitsize="64" type="ieee_double"/>
<reg name="d13" bitsize="64" type="ieee_double"/>
<reg name="d14" bitsize="64" type="ieee_double"/>
<reg name="d15" bitsize="64" type="ieee_double"/>
<reg name="d16" bitsize="64" type="ieee_double"/>
<reg name="d17" bitsize="64" type="ieee_double"/>
<reg name="d18" bitsize="64" type="ieee_double"/>
<reg name="d19" bitsize="64" type="ieee_double"/>
<reg name="d20" bitsize="64" type="ieee_double"/>
<reg name="d21" bitsize="64" type="ieee_double"/>
<reg name="d22" bitsize="64" type="ieee_double"/>
<reg name="d23" bitsize="64" type="ieee_double"/>
<reg name="d24" bitsize="64" type="ieee_double"/>
<reg name="d25" bitsize="64" type="ieee_double"/>
<reg name="d26" bitsize="64" type="ieee_double"/>
<reg name="d27" bitsize="64" type="ieee_double"/>
<reg name="d28" bitsize="64" type="ieee_double"/>
<reg name="d29" bitsize="64" type="ieee_double"/>
<reg name="d30" bitsize="64" type="ieee_double"/>
<reg name="d31" bitsize="64" type="ieee_double"/>
<reg name="fpscr" bitsize="32" type="int" group="float"/>
</feature>
#cf"); [noack mode]
getpkt ("QNonStop:0"); [no ack sent]
[all-stop mode enabled]
putpkt ("$OK#9a"); [noack mode]
getpkt ("?"); [no ack sent]
putpkt ("$T050b:0*"00;0d:10feffbe;0f:800c4648;thread:p533.533;core:0;#4f"); [no]
getpkt ("Hc-1"); [no ack sent]
putpkt ("$E01#a6"); [noack mode]
getpkt ("qC"); [no ack sent]
putpkt ("$QCp533.533#68"); [noack mode]
getpkt ("qAttached:533"); [no ack sent]
putpkt ("$0#30"); [noack mode]
getpkt ("g"); [no ack sent]
putpkt ("$0*}0*"010feffbe0*"00800c464830*}0*}0*}0*}0*}0*F#f5"); [noack mode]
readchar: Got EOF
[getpkt: discarding char '�']
Remote side has terminated connection. GDBserver will reopen the connection.
Listening on port 1234
これは私が使用しているUbuntuシステムの応答です。
(gdb) target remote 192.168.1.2:1234
Remote debugging using 192.168.1.2:1234
warning: Architecture rejected target-supplied description
Remote 'g' packet reply is too long: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010feffbe00000000800c4648300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
(gdb)