6

アプリケーションが実行されている ARM ボードで OpenEmbedded ベースの Linux を実行しています。以前はカーネル 2.6.35、gdb 6.8、gcc 4.3 を実行していました。最近、システムをカーネル 2.6.37、gdb 7.4 (7.3 も試しました)、gcc 4.6 に更新しました。

現在、私のアプリケーションは (ARM ボード上で) もうデバッグできません。gdb で実行しようとするたびに、「gdb: 新しいスレッドが見つかりません: 一般的なエラー」というエラーが表示されます。アプリケーションは pthreads を利用し、pthreads に対してリンクします (readelf は依存関係として libpthread.so.0 をリストします)。これまでに見つけた提案された解決策はすべて、私がすでに行っている pthread へのリンクを推奨しています。私が見つけた他の推奨事項は、 LD_PRELOAD=/lib/libpthread.so.0 を使用することでした。これは私にとって何の違いもありません。

アプリケーションの x86 ビルドのデバッグは問題なく動作します。

編集:最初の回答で提起された質問に答えるために、ターゲット(ARM)でgdbを使用しています。つまり、クロスgdbは使用していません。また、GNU/Linux 2.6 用の libpthread.so.0 (/lib/libpthread-2.9.so: ELF 32 ビット LSB 共有オブジェクト、ARM、バージョン 1 (SYSV)、動的にリンクされた (共有ライブラリを使用)) も削除していません。 16、剥がされていない)。glibc はバージョン 2.9 のままで、更新には Linux イメージ全体の再コンパイルが含まれていました。

EDIT2: /lib/libthread-db* を削除すると、デバッグが可能になります (結果として警告が表示され、明らかに一部の機能が動作しなくなります)

EDIT3: set debug libthread-db 1 を使用すると、次のようになります:

Starting program: /home/root/app
Trying host libthread_db library: libthread_db.so.1.
Host libthread_db.so.1 resolved to: /lib/libthread_db.so.1.
td_ta_new failed: application not linked with libthread
thread_db_load_search returning 0
Trying host libthread_db library: libthread_db.so.1.
Host libthread_db.so.1 resolved to: /lib/libthread_db.so.1.
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/libthread_db.so.1".
warning: Unable to set global thread event mask: generic error
Warning: find_new_threads_once: find_new_threads_callback: cannot get thread info: generic error
Found 0 new threads in iteration 0.
Warning: find_new_threads_once: find_new_threads_callback: cannot get thread info: generic error
Found 0 new threads in iteration 1.
Warning: find_new_threads_once: find_new_threads_callback: cannot get thread info: generic error
Found 0 new threads in iteration 2.
Warning: find_new_threads_once: find_new_threads_callback: cannot get thread info: generic error
Found 0 new threads in iteration 3.
thread_db_load_search returning 1
Warning: find_new_threads_once: find_new_threads_callback: cannot get thread info: generic error
Found 0 new threads in iteration 0.
Cannot find new threads: generic error
(gdb) Write failed: Broken pipe
4

1 に答える 1

8

このエラーの一般的な原因は 2 つあります。

  1. との間に不一致がlibpthread.so.0ありますlibthread_db.so.1
  2. あなたは脱ぎましたlibpthread.so.0

あなたのメッセージは完全に明確ではありません:

  1. クロス GDB を使用して、ARM で実行されているアプリケーションを x86 ホストからデバッグしていますか?
  2. glibcカーネルなどの更新に加えて、更新 (または再構築)しましたか?

を削除した場合はlibpthread.so.0、それを行わないでください。削除しないlibthread_dbようにする必要があります。

クロスデバッグを行っている場合は、ターゲットlibthread_db.so.1で一致するようにホストで再構築してください。glibc

アップデート:

クロスデバッグで
はありません libpthread を削除しませんでした

そのため、GDB の何かglibcが壊れているようです。あなたはそれが何であるかを見ようとすることができます

  1. 取り外しlibthread_dbたパッティング、および
  2. (gdb) set debug libthread-db 1
  3. (gdb) run

更新 2:

警告: グローバル スレッド イベント マスクを設定できません: 一般的なエラー

これは、GDB がtd_ta_set_eventlibthread_db で関数を検索して呼び出すことができたが、関数がエラーを返したことを意味します。__nptl_threads_eventsこれが発生する可能性のある 1 つの方法は、GDB がで関数を見つけられなかった場合libpthread.so.0です。このコマンドは何を生成しますか:

nm /lib/libpthread.so.0 | grep __nptl_threads_events

そのコマンドが出力を生成する場合、例えば:

000000000021c294 b __nptl_threads_events

次に、他に何が失敗しているのかわかりません。何が起こっているのかを把握するには、おそらく GDB 自体をデバッグする必要があります。

一方、grep上記で出力が生成されない場合は、ツールチェーンに問題があります。その変数が rebuilt に表示されない理由を突き止める必要がありますlibpthread.so.0

于 2012-06-01T03:54:02.123 に答える