2014-10-24 5 views
6

ltrace를 사용하려고했습니다. 프로그램에서 사용하는 library.so 파일을 프로파일 링하기 위해 다음 명령을 사용하려고했습니다. sampleapp, ltrace -c -T --library=library.so --output=out.txt ./SampleApp. 그러나 위의 오류를 보여줍니다. 그러나 library.so는 디버그 빌드입니다. 그래서 기호 표가 있어야합니다. 나는 objdump --source library.so | grep CreateSocket()으로 그것을 확인하려고 노력했다. 그 CreateSocket() 함수를 사용하는 코드를 반환합니다. 즉, 기호 테이블이 들어 있습니다. 그 오류가 발생하는 이유보다?ltrace : "library.so"에서 .dynsym 또는 .dynstr을 찾을 수 없습니다.

관련 게시물 : measure CPU usage per second of a dynamically linked library 그것은 실행 SampleApp이 생성 된 방법에 따라 달라집니다

답변

0

. 정적으로 링크 된 경우 오류가 표시됩니다. ltrace는 동적으로 링크 된 응용 프로그램에서만 작동합니다.

ldd SampleApp을 실행하여 공유 개체 종속성을 표시 할 수 있습니다. 그것은 동적으로 링크 및과 libc 의존성을 가지고 있었다되고, ldd의 출력과 같은 라인이 포함됩니다 :

libc.so.6 => /usr/lib/libc.so.6 (0x00007fb24ac53000) 

이 경우를, 당신은은 ltrace 옵션 --library=libc.so.6을 사용할 수 있으며 작동합니다. 그러나 --library=libc.so은 일치하지 않습니다 (오류는 발생하지 않지만 라이브러리 호출은 일치하지 않습니다). 이 때문에 정적 링크의 잘못 할 수있다

not a dynamic executable 

내 생각 엔 것을 :

정적으로 링크

, ldd SampleApp 대신이 출력을 표시합니다. 그러나 중요한 점은 ltrace에이 오류가 표시되면 공유 라이브러리가 아닌 실행 파일 자체 (바이너리)와 작성 방법 (링커 옵션)에서 진단을 시작해야한다는 것입니다.

How does ltrace (library tracing tool) work?에는 ltrace의 내부에 대한 자세한 내용이 나와 있습니다.