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 をアタッチしました。
- アプリケーションを実行します (この場合、起動時に jni を介してライブラリを使用する Java Web アプリを起動する Web サーバー)。
- gdb をそのプロセスに接続しました
gdb -p XXX
(XXX は から取得した pid ですps
)。 - そして
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 レポートにあるため、その関数に移動したことはわかっています)。
関数名が表示されないというアイデアはありますか?