2016-08-11 4 views
1

libsuperdmgr.so이라는 동적 라이브러리를 컴파일했습니다. gdb를 사용하여이 lib를 디버깅 할 때 소스 파일에 링크 할 수 없습니다. 다음과 같이 : 프레임 3과 4에서 소스 파일의 자세한 줄을 보여줄 수 있지만 프레임 2와 프레임 1에서 내 lib에 올 때 자세한 줄 번호가 표시되지 않습니다.왜 gdb가 소스 파일을 찾을 수 없습니까?

#0 std::operator<< <char, std::char_traits<char>, std::allocator<char> > (__os=..., __str=...) 
at /root/gcc/gcc-4.5.1/x86_64-unknown-linux-gnu/libstdc++-v3/include/bits/basic_string.h:2605 
#1 0x00007fffc9ba67db in DmgrWrapper::AddDataStorage(NIODataStorage*, int)() from /home/shawu/infra/wqsim/arch/x86_64_Linux/wqsim_shawu/infra/libsuperdmgr.so 
#2 0x00007fffc9ba6eb0 in NIODataStorageTester::Initialize(int, char const*, WQSim_Config::Element const*)() 
from /home/shawu/infra/wqsim/arch/x86_64_Linux/wqsim_shawu/infra/libsuperdmgr.so 
#3 0x00007ffff543f527 in WQSim_DataRegistry::Handle (this=<value optimized out>, handle=<value optimized out>, cfg=<value optimized out>) 
at wqsim/framework/WQSim_dataregistry.cc:618 
#4 0x00007ffff588eea1 in WQSim_ModuleHandler::LoadModules (this=<value optimized out>) at wqsim/framework/WQSim_modulehandler.cc:125 
#5 0x00007ffff7593586 in wqsim_main_init (argc=<value optimized out>, argv=<value optimized out>) at wqsim/modules/WQSim_main.cc:1016 

왜입니까? 컴파일 할 때 뭔가 잃어 버렸습니까?

답변

1

가장 일반적인 원인은 ... 공유 라이브러리 이 (가) 디버깅을 지원하도록 컴파일 되었습니까? 그렇지 않은 경우 라이브러리의 소스 지점에 대한 바이너리 코드의 포인터가 없으므로 gdb(1)은 코드를 추적 할 수 없으며 소스 코드의 위치를 ​​표시 할 수 없습니다. 또한 라이브러리 소스를 사용할 수 있습니까 (그렇지 않은 경우 소스에 액세스하기가 어려워집니다.이 어설 션은 어리 석다는 것을 알고 있지만 누가 알 수 있습니까?) o

가능한 경우 -g 옵션을 사용하여 공유를 다시 컴파일합니다. 객체 라이브러리에 저장하고 마지막 공유 객체의 디버그 정보를 보존하기 위해 해당 옵션과 링크합니다.

Gdb(1)에는 모듈 정보를 찾는 파일 시스템의 위치를 ​​나타내는 명령이 있지만 소스 코드 지점을 찾기 위해 이진 파일에 포인터가없는 경우 액세스 할 수 없습니다. a.cb.c

a.cmain() 기능을 가지고 있으며, 일반 응용 프로그램 모듈 될 것입니다 :

는 두 개의 파일로 만들어진 프로그램이 있다고 가정하자. b.c은 공유 라이브러리가 될 것입니다.

당신이 (디버그 정보 생성과) 일반적으로 교류를 컴파일하여 응용 프로그램을 컴파일하려면 :

cc -g -c a.c -o a.o 

당신이 사용하는 공유 객체로 b.c을 컴파일하려면 :

cc -fPIC -g -c b.c -o b.so 

그러나 이것은 우리의 최종로드 할 수 없습니다 공유 객체.

cc -g -o libb.so.1.1 -shared -Wl,-soname=b.so.1 b.so 

내가 b.c를 컴파일하고 libb.so.1.1b.so 연결에 -g 옵션을 포함했다 방법 : 우리는 이제 공유 객체를 생성 오브젝트 파일 (충돌 접미사 죄송합니다)로 집계했다.

cc -o a.out -g a.o libb.so.1.1 

a.outa.ob.so.1.1 (에서받은 디버그 정보를하지만 당신이 할 수 있도록하려면 당신은 b.so.1.1에서이 필요합니다 : 이제

, 다음 명령 줄 프로그램을 링크 b.so.1.1의 디버그 정보가 01의 연결 단계에 a.out에 포함되어있는 경우

나는이 순간에 알 수없는

주) 사용이거나 실행시 gdb(1)이 공유 라이브러리에 액세스 할 때 libb.so.1.1에서 수집해야합니다. 라이브러리에있는 데이터이기 때문에 라이브러리에 있어야 할 가능성이 가장 높습니다 (프로그램 작성 후 공유 객체의 다른 구현으로 프로그램을 피드 할 수 있고 디버깅 정보가 다를 수 있음)

관련 문제