SunOS 5.10에서 -g -O0
을 사용하여 내 라이브러리 (특히 protbuf-2.3.0)를 컴파일했습니다.GDB 백 트레이스에 함수 이름이 표시되지 않습니다.
만들기 로그의 샘플 라인이있다 :
- 이 경우에 내 응용 프로그램을 (실행 내 웹 서버 : 다음
/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를 통해 라이브러리를 사용하는 자바 웹 앱을 시작합니다).
- 나는
gdb -p XXX
을 통해 그 프로세스에 gdb를 첨부했다. (여기서 XXX는 내가 가지고있는 pid이다.ps
). - 그리고 나서 gdb 프롬프트에서
file libprotobuf.so
을 사용하여 gdb에서 내 라이브러리를로드했습니다.
그러나 기능 이름은 bt
에서 볼 수 없습니다.
(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
: 내 GDB 역 추적 명령은 다음과 같이 표시됩니다.
이외에도 디버그 모드에서 jvm을 실행하고 System.loadLibrary(..)
명령에 중단 점을 추가하고 해당 명령을 단계별로 실행 한 다음 gdb 첨부 프로세스를 다시 수행했습니다 ....하지만 여전히 아무것도 아닙니다.
그러나 주어진 함수 이름에 중단 점을 넣고 함수의 내용을 list
을 통해 나열 할 수 있습니다. 그러나 다시 한번, 중단 점을 배치 할 수는 있지만 함수 이름에서 멈추지는 않습니다 (모든 jvm 충돌 후 jvm hs_err_pid 보고서에 있기 때문에이 함수로 갔다는 것을 알고 있습니다).
어떤 아이디어라도 내 함수 이름이 표시되지 않습니다.
GDB를 올바르게 호출하지 않았을 가능성이 큽니다. 실행 파일이 링크 된 방법과 GDB를 어떻게 첨부했는지 보여주십시오. –
감사합니다. 이제 시도한 gdb 첨부 프로세스에 대한 추가 정보를 추가했습니다. –