2012-09-17 4 views
1

Eclipse에서 C++ 프로젝트를 빌드 중입니다. XML 파일에서 특정 데이터를 읽기 위해 데이터베이스와 libxml에 SQLite3을 사용합니다. 코드가 잘 컴파일되고 실행 파일이 생성됩니다. 그러나 이진을 실행하면이 메시지로 끝납니다. Segmentation fault (core dumped).신호 11의 기본 동작으로 종료되는 프로세스 [SIGSEGV]

메모리 누수 위치를 감지하기 위해 Valgrind 프로파일 러를 실행할 때 나는이 거대한 로그 파일을 얻을 수 없다.

==4960== Invalid read of size 4 
    ==4960== at 0x41C6EB7: sqlite3SafetyCheckSickOrOk (sqlite3.c:22048) 
    ==4960== by 0x41EADCA: sqlite3_close (sqlite3.c:112926) 
    ==4960== by 0x804A551: Database::close() (CEMDAPnew.cpp:133) 
    ==4960== by 0x805D2F3: CDataCoordinator::ReadVehicleMakeData(std::string) (DataCoordinator.cpp:2709) 
    ==4960== by 0x80689D4: main (GauravWithoutMPI.cpp:36) 
    ==4960== Address 0x4dc1fd0 is 64 bytes inside a block of size 512 free'd 
    ==4960== at 0x402B06C: free (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) 
    ==4960== by 0x41B520F: sqlite3MemFree (sqlite3.c:15252) 
    ==4960== by 0x41A2DF0: sqlite3_free (sqlite3.c:18986) 
    ==4960== by 0x41EB0B4: sqlite3_close (sqlite3.c:113040) 
    ==4960== by 0x804A551: Database::close() (CEMDAPnew.cpp:133) 
    ==4960== by 0x805D2F3: CDataCoordinator::ReadVehicleMakeData(std::string) (DataCoordinator.cpp:2709) 
    ==4960== by 0x80689D4: main (GauravWithoutMPI.cpp:36) 
    ==4960== 
    ==4960== Conditional jump or move depends on uninitialised value(s) 
    ==4960== at 0x4532DD8: inflateReset2 (in /lib/i386-linux-gnu/libz.so.1.2.3.4) 
    ==4960== by 0x4532EC7: inflateInit2_ (in /lib/i386-linux-gnu/libz.so.1.2.3.4) 
    ==4960== by 0x512FE6B: ??? 
    ==4960== 
    ==4960== Conditional jump or move depends on uninitialised value(s) 
    ==4960== at 0x4532DD8: inflateReset2 (in /lib/i386-linux-gnu/libz.so.1.2.3.4) 
    ==4960== by 0x4532EC7: inflateInit2_ (in /lib/i386-linux-gnu/libz.so.1.2.3.4) 
    ==4960== by 0x5056E135: ??? 
    ==4960== 
    ==4960== Invalid read of size 4 
    ==4960== at 0x80BD81C: CMdcevMM::loadXmlString(_xmlNode*, _xmlDoc*, unsigned char*) (ModelModule.cpp:2849) 
    ==4960== by 0x810D73A: CSimCoordinator::LoadXmlString(char const*) (simCoordinator.cpp:8313) 
    ==4960== by 0x8068A4E: main (GauravWithoutMPI.cpp:45) 
    ==4960== Address 0x0 is not stack'd, malloc'd or (recently) free'd 
    ==4960== 
    ==4960== 
    ==4960== Process terminating with default action of signal 11 (SIGSEGV) 

이 출력을 이해해야합니다. 아무도 내가이 오류를 이해하는 데 도움이 될 수 있으며 여기에 어떤 문제가 있습니까?

감사합니다.

답변

2

먼저 Invalid read 오류를 수정해야합니다. 이들은 메모리 누출과 관련이없는 세그멘테이션 오류의 가장 큰 이유입니다.

Valgrind 출력의 첫 번째 Invalid read은 이미 이전에 해제 된 일부 메모리에 대해 sqlite3SafetyCheckSickOrOk 호출을 나타냅니다. 발생한 정확한 호출 스택은 아래에 인쇄되어 있습니다. 해제 된 메모리를 나타내는 것보다 sqlite3_close에서 발생했기 때문에 이상하게 보입니다. 아마 이것은 sqlite 버그입니다.

두 번째 Invalid readCMdcevMM::loadXmlString의 NULL 포인터를 나타냅니다. 코드를 확인하십시오.

+0

그래서 '잘못된 읽기'로 시작해야합니까? 나는 지금까지 생각 해왔다. Segmentation fault와 memory leaks는 동일하다! 다른 메시지는 메모리 사용 효율에 영향을주는 오류 일뿐입니다. – sriramn

+1

예, '유효하지 않은 읽기'는 더 중요한 오류입니다. 다른 오류도 수정해야하지만 때로는 오류를 무시할 수 있습니다. 이는 정확한 오류 메시지에 따라 다릅니다. 조건부 점프 또는 이동은 초기화되지 않은 값에 의존합니다. 아마도 libz에서 시작 되었기 때문에 무시 될 수 있습니다. – ks1322