現在、データベース接続を使用する小さな C++ プログラムを開発しています。これは、CPPCONN コネクタを介した MySQL データベースとの接続です。
原因
複数のスレッドを使用しているため、次のメソッドを作成しました。
void Database::startThread()
{
fDriver->threadInit();
}
void Database::stopThread()
{
fDriver->threadEnd();
}
void Database::connect(const string & host, const string & user, const string & password, const string & database)
{
fDriver = sql::mysql::get_driver_instance();
fConnection.reset(fDriver->connect((SQLString)host,(SQLString)user,(SQLString)password));
fConnection->setSchema((SQLString) database);
fStatement.reset(fConnection->createStatement());
fConnection->setClientOption("multi-queries","true");
fConnection->setClientOption("multi-statements","true");
}
問題は、fDriver->threadInit() 呼び出しでセグメンテーション違反が発生することです。その時点で、fDriver が connect 関数によって適切にインスタンス化されていることを保証できます。(fDriver も null ではありません)
クラッシュ
残念ながら、これ以上有用な情報を提供することはできませんが、これは GDB のバックトレースです。
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff4d66700 (LWP 16786)]
0x0000000000414547 in Database::startThread (this=Unhandled dwarf expression opcode 0xf3
#0 0x0000000000414547 in Database::startThread (this=Unhandled dwarf expression opcode 0xf3) at src/core/database.cpp:73
#1 0x0000000000405443 in Parser::Parser (this=0x7ffff4d659b8) at src/core/sv_parse.cpp:11
#2 0x000000000041e76d in MessageProcessor::MessageProcessor (this=0x7ffff4d659b0, serverStartTime=...) at src/server/messageProcessor.cpp:12
#3 0x000000000041bae8 in Server::__lambda1::operator() (__closure=0x62c740) at src/server/server.cpp:89
#4 0x00007ffff763f550 in execute_native_thread_routine () at ../../../../../libstdc++-v3/src/c++11/thread.cc:84
#5 0x00007ffff6edb851 in start_thread () from /lib64/libpthread.so.0
#6 0x00007ffff6c2994d in clone () from /lib64/libc.so.6
述べる
ここで奇妙な点: このクラッシュは常に発生するわけではありません! 時にはそれは完全に機能します。しかし、そうでない場合、もちろん非常に迷惑です。CPPCONN のバージョンは 1.1.3 で、g++ バージョン 4.8.1 を使用しています。
誰かがこの謎に光を当ててくれることを願っています!
ギリエル