質問

私の質問は、GDB/GDBSERVERを使用して、埋め込みアームプロセッサでアプリケーションをリモートデバッグすることです。

アプリケーション自体をデバッグできますが、アプリケーションはハウスコミュニケーションプロトコルを実装する共有ライブラリに動的にリンクします。共有ライブラリ関数内でブレークポイントを設定できるようにしたいので、いくつかのデバイスの発見の問題を把握してみてください。

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

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

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

役に立ちましたか?

解決

ワイルド推測:共有ライブラリをホストにロードしました GDB 誤ったアドレスで。

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

他のヒント

この質問は2009年のものですが、現在の回答は時代遅れですので、ここに更新があります。

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

@Brent Piddyはそれを言います stop-on-solib-event Gdbserverでは動作しません。これは、少なくともR8Cなので、これも真実ではありません。私の会社には、GDBからのこのNDKの動作に依存する製品がありますが、それなしでは大きなトラブルに陥ります。

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

set breakpoint pending on

悲しいことに、GdbserverはSolibイベントを認識/送信しないため、GDBServerリモートデバッグに「Set Stop-on-Solib-Event on」を使用できません。 Mainのブレークポイントを押した後、GDBに共有ライブラリシンボルをすべてロードするために、Solib-Search-Pathのセットを発行するか、Sysrootコマンドを設定する必要がありました。

走ります main その後 set solib-search-path .

さもないと、 gdbserver ライブラリがロードされる前に、動的ローダーで停止します。で main, 、GDBの準備ができている必要があります。

詳細: Gdbserverで共有ライブラリをデバッグします

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top