0

私は2つの異なるバージョンのライブラリを持っています.libxyz.soとしましょう

2 つの異なる場所で

1) /home/maverick/dev/libxyz.so ( development Version)
2) /home/maverick/prod/libxyz.so ( Production Version )

プログラムをコンパイルし、LD_LIBRARY_PATH に応じてライブラリの適切なバージョンにリンクするセットアップがあります。たとえば、自分のプログラムを libxyz.so の dev バージョンとリンクしたい場合は、LD_LIBRARY_PATH を変更して /home/maverick/dev を追加し、prod バージョンとリンクしたい場合は、LD_LIBRARY_PATH を変更して /home/maverick/prod を追加します。

開発バージョンとの出力をリンクしてプログラムをコンパイルしました

ldd MyProg

libxyz.so => /home/maverick/dev/libxyz.so

プログラムを実行すると、libxyz.soがロードされます

/home/maverick/dev/libxyz.so

そしてうまくいきます。この時点で、私の LD_LIBRARY_PATH には /home/maverick/dev ではなく /home/maverick/prod が含まれています

しかし、GDBを介してこのプログラムをデバッグしようとすると

gdb MyProg

場所からlibxyz.soをロードします

/home/maverick/prod/libxyz.so

デバッグ中に GDB にライブラリの正しいバージョンをロードさせるのに問題があります。だから今まで私がやっていることは、最初にプログラム(devバージョンをロードする)を起動し、gdbをそのPIDにアタッチすることです。しかし、それが次のように実行される場合

gdb MyProg 

そうではない

GDBでsysroot、solib-search-pathを設定するなど、これを修正するためにあらゆることを試みましたが、何も機能していません。実際、ライブラリ gdb のデバッグ バージョンを指すように sysroot を設定したときに、次のようなメッセージが表示された場合

.dynamic section for XXX is not at the expected address

任意の提案をいただければ幸いです。

4

1 に答える 1

1

デバッグ中に GDB にライブラリの正しいバージョンをロードさせるのに問題があります。

推測させてください:あなたは を使用していますよねtcsh

この問題は、おそらく に~/.cshrcリセットLD_LIBRARY_PATHしたことが原因で発生し/home/maverick/prodます。

runGDB でプログラムを実行すると、( $SHELL -c your-program [args...]I/O リダイレクトを使用できるようにするため) 実行されます。

.cshrc解決策:非対話型シェルの環境に触れないでください。たとえば、次のように開始します。

if ($?prompt  ==  0) exit
于 2012-09-27T14:58:25.083 に答える