1. ホーム
  2. gcc

[解決済み] シグナル11[SIGSEGV]のデフォルトアクションでプロセスが終了しています。

2022-02-18 20:21:29

質問

私は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)

この出力の意味を理解する必要があります。どなたか、このエラーの意味を理解し、何が問題なのかを理解する手助けをしていただけませんか?

ありがとうございます。

解決方法は?

まず最初に、以下を修正する必要があります。 Invalid read というエラーが発生します。これらは Segmentation fault の最も可能性の高い原因であり、メモリリークとは関係ありません。

最初の Invalid read を意味し、Valgrind の出力では sqlite3SafetyCheckSickOrOk の呼び出しは、以前に既に解放されたメモリを参照していました。この現象が発生した正確なコールスタックは以下のように表示されます。これは奇妙に見えます。 sqlite3_close これは、解放されたメモリを参照しています。おそらくこれはsqliteのバグでしょう。

2番目の Invalid read でNULLポインタを参照することを意味します。 CMdcevMM::loadXmlString . あなたのコードを確認してください。