1

Eclipse で C++ プロジェクトを構築しています。データベースには SQLITE3 を使用し、XML ファイルから特定のデータを読み取るには libxml を使用します。コードは正常にコンパイルされ、実行可能ファイルが生成されます。ただし、バイナリを実行すると、このメッセージで終了しますSegmentation fault (core dumped)

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)

この出力を理解する必要があります。このエラーを理解するのを手伝ってくれる人はいますか?ここでの問題は何ですか?

ありがとう。

4

1 に答える 1

2

まず、Invalid readエラーの修正を開始する必要があります。これらはセグメンテーション違反の最も可能性の高い原因であり、メモリ リークとは関係ありません。

Invalid readValgrindの最初の出力は、sqlite3SafetyCheckSickOrOk呼び出しが以前に解放されたメモリを参照したことを意味します。それが発生した正確なコール スタックを以下に示します。sqlite3_closeこれは、解放されたメモリを参照するときに発生したため、奇妙に見えます。おそらくこれは sqlite のバグです。

2 つ目Invalid readは、 で NULL ポインタを参照することを意味しますCMdcevMM::loadXmlString。コードを確認してください。

于 2012-09-17T09:32:17.760 に答える