2012-09-17 29 views
1

我建立在Eclipse一个C++项目。它使用SQLITE3 for database和libxml从XML文件读取特定数据。代码编译得很好,并生成可执行文件。但是,当我运行二进制文件时,它会以此消息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 read装置参照在CMdcevMM::loadXmlString为NULL指针。检查你的代码。

+0

所以,我要与所有的'无效read'开始?直到现在我一直在想,分段错误和内存泄漏是相同的!所以其他消息只是影响内存使用效率的错误? – sriramn

+1

是的,'无效读'是更关键的错误。其他错误也应该修复,但有时您可以忽略它们,这取决于确切的错误信息。 “条件跳转或移动取决于未初始化的值”可能会被忽略,因为它起源于libz,而不是在您的代码中。 – ks1322

相关问题