0

ARM デバイスがあり、それをデバッグしたいと考えています。私のホスト コンピューターは Linux 12.04 で、Eclipse を使用しています。ターゲット デバイスで GDBServer を実行します。

シングル プロセス アプリケーションをデバッグできます。しかし、pthread オブジェクトを含むマルチスレッド アプリケーションをデバッグしたい場合、デバッグは失敗します。私は一歩ずつ実行しますが、私が来たとき

pthread_create(&timerSettings.timerThread, NULL, &timerThread, NULL);

ライン デバッガーは以下のエラーを表示します。 "0x40174c84" のソースがありません。

それで、私は何をすべきですか?

なにか提案を?

ありがとう。

4

1 に答える 1

1

ステップごとに実行することで、事実上、デバッガーに phread_create() 関数にステップインするように要求します。もちろん、そのためのソース コードはありません。デバッガーがスレッドのソースに移動することを期待していたと思われる場合は、悪いニュースがあります。そのようには機能しません。

Debugger パースペクティブにいる場合、Eclipse のタスク リストに表示されるはずのスレッドを作成する pthread_create() をステップ オーバーすると。そこからスレッドを選択できます。これを行うと、ソース コード ビューはそのスレッドが到達した場所にジャンプします (さらに悪いニュースが続きます)。これらすべてには、比較的新しいバージョンの gdb (思い出すと 6 以降) が必要であることを忘れないでください。

今、あなたの問題は本当に始まります。gdb のスレッドを使用したデバッグはあまり良くありません。スレッドを選択すると、ソース コードが表示されないことがあります。これは、pthread_create() をステップオーバーしても、スレッドがソース コードの最初の行まで進んだことを意味しないためです。これは、gdb がプログラムを中断すると、そのプログラム内のすべてのスレッドが中断され、新しいスレッドが標準ライブラリのスレッド初期コードから抜け出していない可能性があるためです。したがって、スレッド内のソース コードの最初の行にブレークポイントを設定し、そのブレークポイントに到達するまでプログラムを自由に実行できるようにする必要があります。

しかし待ってください - それまでの間、あなたのメインスレッドは遠ざかってしまい、あなたはそれを制御できなくなります. ブレークポイントに到達するたびにプログラムが gdb によって中断されるため、ブレークポイントを設定することはできません。

要するに、武器庫の正しい痛みです。

gdb コマンドを Eclipse に入力できます。これは、スレッド固有のブレークポイントを設定したり、gdb をノンストップ モードやバックグラウンド非同期モードに設定したりできるため、少し役立ちます。これらは何もないよりはましですが、私の経験では、すべての作業を行うわけではありません。さらに悪いことに、Eclipse はそれらをまったく認識していないように見えるため (私は古くなっている可能性があります)、手動でコマンドを入力する必要がなくなります。その場合、そもそも Eclipse 内で実行しない方がよいでしょう。

これをご覧になることをお勧めします。良いトリックは、すべてのスレッドの開始時にループ内にスリープを配置し、ループ条件を変更しない変数にすることです。そうすれば、スレッドが作成されたときにスレッドに切り替え、必要なブレークポイントを設定してから、ループ変数の値を自分で変更して、スレッドを続行するとループを終了してブレークポイントまで実行されるようにすることができます。

- 編集 -

私は古くなっているようです。これを見てください。Eclipse は現在、ノンストップ モードとスレッド固有のブレークポイントを認識しているようです。すべてのスレッドで catch-at-start スリープ ループを結合したもの (おそらく Eclipse はそれを解決できるかもしれません) は、スレッドのデバッグを許容できるようにします。

于 2013-03-16T08:18:33.870 に答える