7

私の質問は、gdb/gdbserver を使用した組み込みアーム プロセッサでのアプリケーションのリモート デバッグに関するものです。

アプリケーション自体をデバッグできますが、アプリケーションは社内通信プロトコルを実装する共有ライブラリに動的にリンクします。共有ライブラリ関数内にブレークポイントを設定できるようにしたいので、デバイス検出の問題を解決してみてください。

ライブラリがデバッグ シンボルを使用してコンパイルされ、ホスト側で gdb によって読み込まれることを確認しました。ライブラリ内の関数を一覧表示し、ブレークポイントを設定することもできますが、アプリケーションを実行しようとするとすぐにエラー メッセージが表示されます。の効果:

Cannot insert breakpoint X.
Error accessing memory address : Input/output error.

ここで、X は gdb のブレークポイント番号であり、アドレスが小さすぎて有効ではありません。
ターゲット マシンとホスト マシンの両方で新しいライブラリを使用していますがmount -o bind newlib oldlib、ターゲットでは nfs マウントを使用しています。
何が間違っている可能性があるかについて誰かが考えを持っていますか? 前もって感謝します。

4

4 に答える 4

6

この質問は2009年のものですが、現在の回答は古くなっているため、更新があります:

@Employed Russian は、 を使用する必要があることを提案しましたstop-on-solib-event。これはもはや真実ではありません。NDK r8d は、まだロードされていない solib の保留中のブレークポイントをサポートしています。

@Brent Piddy は、gdbserver ではstop-on-solib-event機能しないと言います。これも、少なくとも r8c 以降では当てはまりません。私の会社には、GDB からのこの NDK 動作に依存する製品があります。それがなければ、大きな問題になるでしょう。

于 2013-01-14T23:38:26.467 に答える
0

次のコマンドを使用して、共有オブジェクト ライブラリが読み込まれた後に解決される保留中のブレークポイントを設定します。

set breakpoint pending on

残念ながら、gdbserver は solib イベントを認識/送信しないため、gdbserver のリモート デバッグに「set stop-on-solib-event on」を使用することはできません。main でブレークポイントに到達した後、set solib-search-path または set sysroot コマンドを発行して、gdb にすべての共有ライブラリ シンボルをロードさせる必要がありました。

于 2012-11-08T16:55:45.783 に答える
0

GDB大げさな推測:間違ったアドレスで共有ライブラリをホストにロードしました。

明示的に GDB にロードする代わりに、 を使用"set stop-on-solib-event on"し、ライブラリがロードされるのを待って (info sharedロードされたライブラリの現在のリストが表示されます)、ブレークポイントを設定します。

于 2009-11-07T07:05:52.323 に答える