組み込み開発の分野では、デバッグはプログラムの安定した動作を保証するための重要なステップです。 OKMX8MP-C 開発ボードを使用する開発者は、GDB リモート デバッグ手法を習得することで開発効率を大幅に向上させることができます。 GDB (GNU Project Debugger の略) は、Linux 上の包括的なデバッグ ツールです。 GDB は、ブレークポイントの設定、シングルステップ実行、変数の出力、変数の監視、レジスタの検査、コール スタックの表示など、さまざまなデバッグ方法をサポートしています。
Linux 環境のソフトウェア開発では、GDB は C および C プログラムのデバッグに使用される主要なデバッグ ツールです。 OKMX8MP-C の 5.4.70 バージョンには、デフォルトで gdbserver がサポートされており、当社が提供する開発環境もデフォルトで gdb をサポートします。次に、OKMX8MP-C で GDB リモート デバッグを実行する方法を詳しく説明します。
forlinx@ubuntu:~$ $CC -g test_bug.c -o test_bug
このコマンドは、test_bug.c ソース ファイルをコンパイルし、デバッグ情報を含む実行可能ファイル test_bug を生成します。このようにして、GDB は後続のデバッグ プロセス中にソース コード内の対応する位置を正確に特定できます。
コンパイル後、生成された実行可能ファイルを開発ボードにコピーする必要があります。これは通常、シリアル ポート、ネットワーク、またはその他のファイル転送方法を介して実現されます。この例では、test_bug ファイルが開発ボードの / ディレクトリにコピーされていることを前提としています。
IP アドレスを設定します:
ifconfig コマンドを使用して、開発ボードの IP アドレスを設定します。例:
ifconfig eth0 172.16.0.109
ここでは、開発ボードの IP アドレスは 172.16.0.109 に設定されています
開発ボード上で gdbserver を起動し、リスニング ポート番号とデバッグするプログラムを指定します。例:
gdbserver 172.16.0.109:2345 /test_bug
このコマンドは gdbserver を起動し、ポート 2345 で GDB クライアントからの接続リクエストをリッスンします。
root@OK8MP:~# ifconfig eth0 172.16.0.109
root@OK8MP:~# gdbserver 172.16.0.109:2345 test_bug
プロセス /home/root/test_bug が作成されました。 pid = 1356
ポート 2345 でリッスン
仮想マシンまたはホストで、開発ボードと同じネットワーク セグメント内の IP アドレスを設定し、ping コマンドを使用して開発ボードとの接続をテストします。
開発ボードの IP アドレスの ping が成功することを確認します。これはリモート デバッグの前提条件です。
仮想マシンまたはホスト上で、aarch64-poky-linux-gdb コマンドを使用して GDB クライアントを起動し、デバッグするプログラムを指定します。例:
forlinx@ubuntu:~/aarch64-poky-linux-gdb test_bug
GNU gdb (GDB) 8.3.1
Copyright (C) 2019 Free Software Foundation, Inc.
ライセンス GPLv3 : GNU GPL バージョン 3 以降 http://gnu.org/licenses/gpl.html
これはフリー ソフトウェアです。自由に変更したり再配布したりできます。
法律で認められる範囲においては、いかなる保証もありません。
詳細については、「コピーを表示」および「保証を表示」と入力してください。この GDB は「--host=x86_64-pokysdk-linux --target=aarch64-poky-linux」として構成されました。
構成の詳細については、「showconfiguration」と入力します。
バグ報告の手順については、以下を参照してください:
http://www.gnu.org/software/gdb/bugs/
GDB マニュアルおよびその他のドキュメント リソースは、次の場所でオンラインで検索できます。
http://www.gnu.org/software/gdb/documentation/
ヘルプを表示するには、「ヘルプ」と入力します。
「apropos word」と入力して、「word」に関連するコマンドを検索します...
test_bug からシンボルを読み取り中...
(gdb)
ボードに接続します:
GDB クライアントで、target リモート コマンドを使用して、ボード上の gdbserver に接続します。例:
(gdb) ターゲットリモート 172.16.0.109:2345
172.16.0.109:2345
を使用したリモート デバッグ
リモートターゲットから /lib/ld-linux-aarch64.so.1 を読み取り中...
警告: リモート ターゲットからのファイル転送は遅くなる可能性があります。ファイルにローカルでアクセスするには、代わりに「set sysroot」を使用してください。
リモートターゲットから /lib/ld-linux-aarch64.so.1 を読み取り中...
target:/lib/ld-linux-aarch64.so.1...
からシンボルを読み取ります
リモートターゲットから /lib/ld-2.30.so を読み取り中...
リモート ターゲットから /lib/.debug/ld-2.30.so を読み取り中...
リモート ターゲットから /lib/.debug/ld-2.30.so を読み取り中...
ターゲットからシンボルを読み取ります:/lib/.debug/ld-2.30.so...
target:/lib/ld-linux-aarch64.so.1 からの _start () 内の 0x0000fffff7fcf080
(gdb)
この時点で、GDB クライアントはボード上の gdbserver に接続し、リモート デバッグを開始する準備が整います。
l (リスト): ソースコードをリストします。
b (ブレーク): ブレークポイントを設定します。
n (次へ): コードを 1 行ずつステップ実行します。
s (ステップ): 関数を 1 行ずつ実行するためにステップインします。
c (継続): プログラムの実行を継続します。
p (print): 変数の値を出力します。
たとえば、l コマンドを使用して、現在の場所にあるソース コードを表示します。
(gdb)l
12 }
13
14 void A(int *p)
15 {
16 B(p);
17 }
18
19 void A2(int *p)
20 {
21 C(p);
(gdb)
次に、B コマンドを使用して、行 16 などの行にブレークポイントを設定できます。
bash コードをコピー
(gdb) b 16
0x のブレークポイント 1...: ファイル test_bug.c、16 行目。
プログラムの実行を続けるには、c コマンドを使用します。プログラムはブレークポイントで一時停止し、さらなるデバッグを待ちます。
変数の監視: watch コマンドを使用して、変数の変更を監視します。変数の値が変更されると、GDB は自動的に実行を一時停止します。
マルチスレッド デバッグ: プログラムがマルチスレッドの場合、スレッド コマンドを使用してデバッグ用のスレッドを切り替えます。
セキュリティに関する考慮事項: リモート デバッグ中は、ネットワーク環境のセキュリティを確保することが重要です。 SSH トンネルまたはその他の暗号化方式を使用して、デバッグ データの送信を保護します。
OKMX8MP-C GDB リモート デバッグ スキルは以上です。この強力なツールにより、効率的な問題解決と開発の強化が可能になります。
以上がOKMX-C GDB リモート デバッグ スキルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。