2010-08-19 1 views
0

동적으로로드 된 라이브러리를 사용하는 큰 응용 프로그램이 있습니다. 프로그램을 끝낼 때 프로그램을 종료 할 때 "glibc가 손상된 이중 연결 목록을 발견했습니다"라는 메시지를 segfaults 또는 spits합니다. 하자 우리는 세 개의 파일이 있다고 가정 : 다음 Valgrind의 출력을 보면 나는이 사건이 무엇인지 생각gcc, C++ : 정적 문자열 멤버 가변성 힙 손상/분할 오류 발생

utilities.c  - compiled with -fPIC and used ar and ranlib to create utilities.a. 
dynamicallyloaded.c- compiled with -fPIC and -shared and linked with utlities.a to generate dynamicallyloaded.so 
main.c    - compiled with -fPIC and linked with utilities.a to create main. main dynamically loads and uses dynamicallyloaded.so . 
utilities.h  - delclared a class IfTrackerFile with AubFileName as a static string member like static string   AubFileName; 

utilities.cpp  - defines the static variable: string IfTrackerFile::AubFileName; 

Valgrind의 아웃 무료 무효가 있음// 삭제 라인에 삭제 말한다 : 문자열 IfTrackerFile :: AubFileName;

실마리가 없습니다. 이와 관련하여 도움/방향에 진심으로 감사드립니다.

+0

정적 라이브러리 사용은 간단하지 않습니다. 공유 라이브러리로 모든 것을 컴파일하고 컴파일러가 그것을 정렬합니다. –

답변

0

이것은 어둠 속에서 촬영 한 것이지만 문제는 글로벌 개체가 될 수 있습니다. 클래스를 글로벌 변수로 인스턴스화하면 main()이 호출되기 전에 변수가 인스턴스화됩니다. 즉, main()이 시작되기 전에 생성자가 호출되고 main이 완료된 후 소멸자가 호출됨을 의미합니다. 생성자와 소멸자가 호출되는 순서 또한 불확정하다.

내 충고는 모든 전역 개체 (일반 이전 데이터가 아닌 전역 변수 -POD 유형)를 주 시작 부분에서 인스턴스화되고 주 끝 부분에서 삭제되는 포인터로 변환하는 것입니다.

1

내 생각에 당신은 IfTrackerFile::AubFileName의 두 가지 사본으로 끝났습니다. 하나는 프로그램에서 직접 utilities.a에서 가져오고 다른 하나는 동적으로 dynamicallyloaded.so을로드합니다. 나는 이것이 프로그램 종료시 모든 정적 및 전역 객체를 파괴하는 시스템을 혼란스럽게 만들었고 결국 소멸자를 두 번 호출하게되었다고 생각합니다.

이런 방식으로 .a 및 .so 파일을 혼합해서 사용해야한다고 생각하지 않습니다. 기본적으로 .a-fPIC 코드를 넣어도 파일을 .a에 연결하지 않는 것이 좋습니다.