2010-07-28 2 views
8

나는 디버깅을 시도하고있는 간단한 C++ 프로그램을 가지고 있지만 gdb는 라이브러리에 대한 객체 파일을 찾을 수 없거나 디버그 정보를 사용할 수 없으며 실행 파일의 디버그 심볼도 찾을 수없는 것 같습니다.어떻게 MacPorts gcc 4.5에서 C++ 0x 프로그램을 디버깅합니까?

내가 MacPorts를 함께 OSX 10.5.8 오전, 나는

그램 ++ 내 코드를 컴파일 - MP-4.5 -Wall -pedantic -std = C + +0 -g -ggdb -I/선택/지역/포함 -L/옵션/local/lib 등 -lgsl -static-된 libstdC++ MCMC-simplex.cpp -o MCMC

(이 하나 개의 파일이고, g는 ++ - MP-4.5 MacPorts를하다 gcc/g ++ 4.5 실행 파일)

결과 실행 파일에서 gdb를 실행하면 많은 오류 메시지가 표시됩니다. 형태

경고의 시작은) : 오브젝트 파일 "/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_lang_gcc45/work/build/i386-apple-darwin9/libgcc/trunctfdf2_s을 찾을 수 없습니다. o "-"../../../gcc-4.5.0/libgcc/../gcc/config/soft-fp/trunctfdf2.c "에 사용할 수있는 디버그 정보가 없습니다.

나는 macports가 빌드 중에 버그가 있다는 것을 나타냅니다 (gdb가 임시 빌드 디렉토리의 객체 파일을 찾는 것처럼 보입니다).

gdb (Apple에서 제공하는 프로그램)에서 내 프로그램 목록을 보려고하면 .s 파일을 /var/tmp에 임의로 찾아 봅니다.이 파일은 어셈블러 파일처럼 들립니다. 그래서 내 프로그램에 대한 디버그 기호를 찾지 못하는 것입니다. `/var/folders/Xa/XaqHO9PeEC8K-Nrd0L9xWk+++TM/-Tmp-//cc2IvFto.o ': 할 수 없습니다 내가 MacPorts를 7.1을 gdb를하려고하면

, 나는

경고를 얻을 기호 읽기 : 해당 파일이나 디렉토리가 없습니다. (디버깅 기호 없음) ... 완료되었습니다.

그리고 최종 결과는 같지만 Apple의 gdb에서 제공하는 많은 오류 메시지는 없습니다.

누구나이 문제를 발견하고 해결 방법을 찾았습니까?

답변

5

글쎄, 당신 g ++ 명령 줄에
-save-temps=obj
를 추가하는 것입니다 단일 컴파일 및 링크 단계를 계속하는 또 다른 "트릭"그래서

4 제거/tmp를/[ random-string] .o 및 .s

실제로는 일종의 수행되지 않습니다. 실제로 실제로 랜덤 스트링 대신 구축중인 디렉토리에 표준 SOURCE.o 및 SOURCE.s 파일이 있습니다. 일부 임시 폴더에서는 [os]가 표시되지만 그 지점부터 괜찮아요 디버깅 기호를 찾는보기

+0

너무 좋지 않아 여러 질문을 "최고"라고 말할 수는 없습니다. 정보 주셔서 감사합니다! –

+0

감사! 이것은 gdb를 사용하여 포트란 프로그램을 디버깅 할 때 도움이되었습니다. gfortran 4.4의 경우 플래그의'[= dir]'부분을 인식하지 못하기 때문에'-save-temps' 만 사용해야합니다. –

11

다른 UNIXen과 달리 MacOS에서는 디버그 정보가 실행 파일에 링크되어 있지 않습니다. 대신 실행 파일에는 링크 된 오브젝트 파일 목록이 있으며 디버거는 이러한 개별 오브젝트 파일에서 디버그 정보를 찾습니다.

개체 파일을 제거하면 디버그 할 수 없습니다.

  1. 어셈블리 파일을 생성 /tmp/[random-string].s
  2. /tmp/[random-string].o
  3. 링크 /tmp/[random-string].o로 조립 crt0.o, libc 등 :

    컴파일하고 "단일 단계"에있는 실행 파일을 링크, GCC이 수행 실행 파일은 mcmc입니다.

  4. 제거를 /tmp/[random-string].o

그것은 디버깅 못하도록 마지막 단계입니다 .s.

해결 방법 : 이것은 현재 디렉토리에 MCMC-simplex.o을 떠날 것이며, GDB는 디버그 정보를 찾을 수 있습니다

g++-mp-4.5 -Wall -pedantic -std=c++0x -g -ggdb -c MCMC-simplex.cpp 
g++-mp-4.5 MCMC-simplex.o -lgsl -static-libstdc++ -o mcmc 

.

+0

감사합니다. 이것은 내 코드를 디버깅 할 수있게하지만, 여전히 타입 오류가 발생한다 경고 :'/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_lang_gcc45/work/build/i386-apple-darwin9/libgcc/ _powixf2_s.o ': 기호를 읽으려면 열 수 없습니다 : 해당 파일이나 디렉토리가 없습니다. 내가 MacPorts에서 책임을 져야한다고 생각합니다. –

+0

러시아와 같은 문제는 gcc 라이브러리의 .o 파일이 없다는 것입니다. gcc 라이브러리에 들어가시겠습니까? 당신은 macports 컴파일러 개체 주위에 떠날 수 있습니다. macports.conf 옵션을 참조하십시오. portautoclean – Mark

+0

@Mark, 어떤 옵션은 macports.conf로'.o' 파일을 유지합니까? – highBandWidth

2

당신에게 두 가지 문제가있었습니다 : 1) 실행 파일에 대한 디버그 기호가없고 2) 경고를 생성 한 일부 공유 라이브러리에 대한 디버그 기호가 없습니다. 나는 또한 문제 2)를 가지고 있었다. 러시아인은 1)에 대답하고 2)에 대한 올바른 방향으로 나를 지적했다.

먼저 경고에 언급 된 라이브러리를 디버깅 할 필요가없는 경우 안전하게 무시할 수 있습니다. 물론 경고는 성가 시며 다른 문제를 숨길 수 있습니다. 귀하와 귀하의 경우, MacPorts가 설치 한 라이브러리에는 디버그 심볼이 없어야했지만 그렇지 않았습니다. 기호 자체는 빌드 과정에서 생성 된 객체 파일에 보관되어 있고 설치되어있는 라이브러리에서는 유지되지 않기 때문에 경고를하게되는 이유는 Employed Russian이 말했듯이 말입니다. 라이브러리는 (최소) 디버그 정보의 일부로 오브젝트 파일에 대한 포인터를 저장합니다.

strings 명령을 사용하여이를 확인할 수 있습니다. 당신은 libsomething.dylib로드 할 때 찾을 수 없습니다 /crazy/path/to/something.o gettings 경고 경우 :

strings - libsomething.dylib | grep something.o 

주 당신이 필요로하는 '-'(이 나에게 처음으로있어).

은과 같이, 스트립 디버깅 정보를 수정하려면 :

strip -S libsomething.dylib 

이후, 'dwarfdump --file-통계 libsomething.dylib'는 "이 디버그를 찌른다"고 표시해야합니다 섹션이 비어 있습니다. (오브젝트 파일에 대한 링크는 STABS 디버그 형식으로 저장됩니다.)

더 이상 경고하지 않습니다 .. 예!

방법 너무 어려웠습니다.

+0

이 문제가 있었는데 스트립 -S는 우리가 제작 한 일부 dylib에 대해 만들었지 만 /Library/Frameworks/Blah.framework/Versions/Current/Blah에 설치된 프레임 워크를 제거해야했습니다. –