2017-03-23 6 views
0

私はrtlシミュレーションを実行していますが、シミュレータ実行ファイルはいくつかの共有オブジェクトを読み込みます。シミュレーション中に呼び出されるさまざまなpliルーチンの定義を持つオブジェクトが1つあります。私は特定の.soファイル内の関数をデバッグすることに興味があります、これはroutines.soと言いましょう。デバッグをサポートしたroutines.soのバージョンをコンパイルしました。今、シミュレーションは既に実行されており、gdbプロセスをシミュレータの実行可能ファイルに添付しています。リリースエリアからroutines.soをピックアップしています。現在のgdbセッション自体にdebug version of routines.soを接続する方法があるかどうか疑問に思っていましたか?私はいつでもシミュレーションを再開することができ、最初からデバッグバージョンを取得することができることを知っていますが、これらのシミュレーションは興味のあるポイントに達するまで何時間もかかるので、私はroutines.soのフライ置換えで行うことができますか?gdbでアプリケーションをデバッグするときに.soファイルの別のバージョンを接続することは可能ですか?

答えて

0

現在のgdbセッション自体に、デバッグバージョンのroutines.soをプラグインする方法があるのでしょうか?

シミュレータでroutines.soのアンロードとリロードが許可されていない場合はありません。

これらのシミュレーションは興味のあるポイントに到達するまでに時間がかかるので、私はルーチンのフライ置換えで行うことができますか?

あなたが行うことができるかもしれませんどのような番号はデバッグ情報をroutines.soリリースバージョンをビルドです:

gcc -g -fPIC -O2 routines.c -shared -o routines.so 

(リリースバージョンを構築するために使用されたものは何でもフラグで-O2を置き換えます)。

次に(gdb) add-symbol-file /path/to/release-g/routines.so $load_addressを使用してください($load_addressの代わりに(gdb) info shared routines.soを使用してください)。

これにより、ソースレベルで「興味のあるポイント」をデバッグできます。これは、最適化されていないバージョンのデバッグ(コードのジャンプ、変数の最適化など)ではなく、アセンブリレベルでのデバッグよりも優れています。

ELFプラットフォームを使用している場合は、いつでもデバッグできるように、separate debuginfo filesroutines.soをビルドする必要があります。

関連する問題