4

SunOS 5.10 を使用してライブラリ (具体的にはprotbuf-2.3.0 ) をコンパイルしました。-g -O0

make ログのサンプル行は次のとおりです。

/bin/bash ../libtool --tag=CXX   --mode=compile g++ -DHAVE_CONFIG_H -I. -I..    -D_REENTRANT -pthreads -Wall -Wwrite-strings -Woverloaded-virtual -Wno-sign-compare  -g -O0 -MT text_format.lo -MD -MP -MF .deps/text_format.Tpo -c -o text_format.lo `test -f 'google/protobuf/text_format.cc' || echo './'`google/protobuf/text_format.cc
libtool: compile:  g++ -DHAVE_CONFIG_H -I. -I.. -D_REENTRANT -pthreads -Wall -Wwrite-strings -Woverloaded-virtual -Wno-sign-compare -g -O0 -MT text_format.lo -MD -MP -MF .deps/text_format.Tpo -c google/protobuf/text_format.cc  -fPIC -DPIC -o .libs/text_format.o

次に、次の手順を使用して gdb をアタッチしました。

  1. アプリケーションを実行します (この場合、起動時に jni を介してライブラリを使用する Java Web アプリを起動する Web サーバー)。
  2. gdb をそのプロセスに接続しましたgdb -p XXX(XXX は から取得した pid ですps)。
  3. そしてfile libprotobuf.so、gdbプロンプトから使用して、gdbからライブラリをロードしました。

しかし、 から関数名が表示されませんbt。私の GDB バックトレース コマンドは次のように表示されます。

(gdb) bt 
#0  0xf8f98914 in ?? ()
#1  0xf8f98830 in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

#1 & #2のみ、#1 & #3のみ、#1 & もやってみgdb libprotobuf.so -p XXXました。

それらとは別に、デバッグモードでjvmを実行して、System.loadLibrary(..)コマンドにブレークポイントを追加してみました。そのコマンドをステップオーバーした後、gdbアタッチプロセスを再度実行しました....しかし、まだ何もありません。

ただし、関数名を指定してブレークポイントを配置し、 を介して関数の内容を一覧表示することはできますlist。しかし、繰り返しになりますが、ブレークポイントを配置できますが、それらの関数名でも停止しません (jvm がクラッシュするたびに jvm hs_err_pid レポートにあるため、その関数に移動したことはわかっています)。

関数名が表示されないというアイデアはありますか?

4

3 に答える 3

2

問題は、GDBが特定のPIDの完全な実行可能パスを把握する方法を知らないことにある可能性が最も高いです。フルパスがわかっている場合は、手順3を実行する必要はありません。GDBが自動的に追加します。

コマンドを使用して、GDBが実行可能ファイル名を正しく推定したかどうかを確認できます(gdb) info file

私の推測が正しければ、次のように呼び出してGDBを支援します。

  gdb /path/to/java <PID>

それはあなたのすべての問題をすぐに解決するはずです。

于 2010-03-10T07:35:34.083 に答える
2

さらに、ライブラリを使用する実行可能ファイルがどこかで削除されていないことを確認してください。

于 2010-03-10T07:43:26.670 に答える
-3

リンクの問題だと思います。リンク時に実行されるコマンドを確認できますか。これが役立つことを願っています。

于 2010-03-10T04:34:38.473 に答える