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)
이 출력을 이해해야합니다. 아무도 내가이 오류를 이해하는 데 도움이 될 수 있으며 여기에 어떤 문제가 있습니까?
감사합니다.
그래서 '잘못된 읽기'로 시작해야합니까? 나는 지금까지 생각 해왔다. Segmentation fault와 memory leaks는 동일하다! 다른 메시지는 메모리 사용 효율에 영향을주는 오류 일뿐입니다. – sriramn
예, '유효하지 않은 읽기'는 더 중요한 오류입니다. 다른 오류도 수정해야하지만 때로는 오류를 무시할 수 있습니다. 이는 정확한 오류 메시지에 따라 다릅니다. 조건부 점프 또는 이동은 초기화되지 않은 값에 의존합니다. 아마도 libz에서 시작 되었기 때문에 무시 될 수 있습니다. – ks1322