2010-03-09 5 views
4

SunOS 5.10에서 -g -O0을 사용하여 내 라이브러리 (특히 protbuf-2.3.0)를 컴파일했습니다.GDB 백 트레이스에 함수 이름이 표시되지 않습니다.

만들기 로그의 샘플 라인이있다 :

  1. 이 경우에 내 응용 프로그램을 (실행 내 웹 서버 : 다음

    /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를 통해 라이브러리를 사용하는 자바 웹 앱을 시작합니다).

  2. 나는 gdb -p XXX을 통해 그 프로세스에 gdb를 첨부했다. (여기서 XXX는 내가 가지고있는 pid이다. ps).
  3. 그리고 나서 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 보고서에 있기 때문에이 함수로 갔다는 것을 알고 있습니다).

어떤 아이디어라도 내 함수 이름이 표시되지 않습니다.

+0

GDB를 올바르게 호출하지 않았을 가능성이 큽니다. 실행 파일이 링크 된 방법과 GDB를 어떻게 첨부했는지 보여주십시오. –

+0

감사합니다. 이제 시도한 gdb 첨부 프로세스에 대한 추가 정보를 추가했습니다. –

답변

-2

나는 그것이 문제를 연결하고 있다고 생각합니다. 링크 할 때 실행되는 명령을 확인할 수 있습니까? 희망이 도움이 될 것입니다.

+2

당신의 대답은 도움이되지 않습니다 : 무엇을위한 명령을 확인 하시겠습니까? 그리고 왜 이것이 이것이 연결과 관련이 있다고 생각합니까? –

1

GDB는 주어진 PID에 대한 완전한 실행 경로를 찾는 방법을 모른다. 전체 경로를 알고 있다면 3 단계를 수행 할 필요가 없습니다. GDB가 자동으로 경로를 추가했을 것입니다.

(gdb) info file 명령으로 GDB가 실행 파일 이름을 올바르게 계산했는지 확인할 수 있습니다. 내 추측이 맞다면

이처럼 호출하여 GDB 도움 :

gdb /path/to/java <PID> 

을 즉시 모든 문제를 해결해야한다고.

1

또한 라이브러리를 사용하는 실행 파일이 어딘가에서 제거되지 않았는지 확인하십시오.