2

古い開発ボードから新しい開発ボード(ARM cortex A9を搭載したiMX6サーベルライトボード)に移行した後、アプリケーションをデバッグしようとしています。__answer__sectionで説明されているように、ホストでgdbを実行し、開発ボードでgdbserverを実行しています。クロス(ARM)デバッグでgdbが使用するランタイムライブラリ(libc、ldなど)を変更するにはどうすればよいですか。

アプリケーションを実行しようとしているときに、スレッドを作成する手順を実行すると、次のようになります。

(gdb) 
681             if (pthread_create(&serial_thread, &attr_detach, read_serial, argv[1]) != 0){
(gdb) 
    Cannot remove breakpoints because program is no longer writable.
    Further execution is probably impossible.
0x00023308 in main (
    argc=<error reading variable: Cannot access memory at address 0x7efffc8c>, 
    argv=<error reading variable: Cannot access memory at address 0x7efffc88>)
    at main_process/main_process.c:681
681             if (pthread_create(&serial_thread, &attr_detach, read_serial, argv[1]) != 0){
    warning: Error removing breakpoint 0
    Cannot access memory at address 0x7efffc88
(gdb) info threads
      Id   Target Id         Frame 
    * 1    Thread 2588.2588  0x00023308 in main (
    argc=<error reading variable: Cannot access memory at address 0x7efffc8c>, 
    argv=<error reading variable: Cannot access memory at address 0x7efffc88>)
    at main_process/main_process.c:681

その後、デバッグの実行を続行できません。コードをステップスルーするのではなく、単にコードを実行すると、次のようになります。

(gdb) c
Continuing.
[Inferior 1 (process 2601) exited with code 0377]

作成するスレッドにブレークポイントを追加すると、そこで実行が停止しますが、その後も続行できません(終了しません)。

スレッドスタックサイズが小さい可能性について読みましたが、それは8MBであり、引数argv [1](現時点では空です)のみをスレッドに渡しています。

Linaro gcc-linaro-arm-linux-gnueabi-2012.04-20120426_linuxツールチェーンを使用して、アプリケーションを作成しました。ボード上で実行されている(そしてデバッグ中に使用される)共有ライブラリは、LTIB_201204rootfsに属しています。

ご協力ありがとうございました

4

1 に答える 1

2

libthread_db.so最初に がボード上に存在し、ストリップされていないことを確認できますnmか (出力を確認してください)。私はLTIBを個人的に使用したことはありませんが、このFreescaleアプリケーションノートの2ページ目から:

共有ライブラリの読み込みやスレッドの作成などのプロセス イベントを正しくキャッチするには、これらの共通機能を実装する共有ライブラリを、シンボルを削除せずにターゲットにデプロイする必要があります。Linux ユーザー空間の場合は ld.so、libthread_db.so、libpthread.so であり、i.MX/LTIB の特定のケースの場合は、LTIB ターゲット イメージ生成メニューのストリップ オプションのチェックを外します。

于 2013-03-12T18:05:14.577 に答える