关于ORM事务提交的Wt Segfault

时间:2015-07-01 14:19:39

标签: c++ c++11 wt dbo wt-dbo

http://www.webtoolkit.eu/wt/doc/tutorial/dbo.html

  

本教程中使用的示例的完整源代码在Wt的examples/feature/dbo/文件夹中以可立即运行的程序的形式提供。

我正在尝试从该目录运行tutorial1.C,我得到以下输出:

(gdb) run
Starting program: /home/lawsa/sources/memory/dist/flashcard --docroot . --http-address 0.0.0.0 --http-port 9090
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/usr/lib/libthread_db.so.1".
begin transaction
create table "user" (
  "id" integer primary key autoincrement,
  "version" integer not null,
  "name" text not null,
  "password" text not null,
  "role" integer not null,
  "karma" integer not null
)
commit transaction
created tables
ending transaction

Program received signal SIGSEGV, Segmentation fault.
0x000000000041a4a8 in void std::vector<Wt::Dbo::ptr_base*, std::allocator<Wt::Dbo::ptr_base*> >::emplace_back<Wt::Dbo::ptr_base*>(Wt::Dbo::ptr_base*&&) ()
(gdb) bt
#0  0x000000000041a4a8 in void std::vector<Wt::Dbo::ptr_base*, std::allocator<Wt::Dbo::ptr_base*> >::emplace_back<Wt::Dbo::ptr_base*>(Wt::Dbo::ptr_base*&&) ()
#1  0x0000000000419c8e in std::vector<Wt::Dbo::ptr_base*, std::allocator<Wt::Dbo::ptr_base*> >::push_back(Wt::Dbo::ptr_base*&&) ()
#2  0x0000000000419682 in void Wt::Dbo::Session::implSave<User>(Wt::Dbo::MetaDbo<User>&) ()
#3  0x0000000000418c4e in Wt::Dbo::MetaDbo<User>::flush() ()
#4  0x00007ffff6c8eae2 in Wt::Dbo::Session::flush() ()
   from /usr/lib/libwtdbo.so.38
#5  0x00007ffff6c9d14d in Wt::Dbo::Transaction::Impl::commit() ()
   from /usr/lib/libwtdbo.so.38
#6  0x00007ffff6c9d1a9 in Wt::Dbo::Transaction::commit() ()
   from /usr/lib/libwtdbo.so.38
#7  0x00000000004063d2 in run() ()
#8  0x0000000000407066 in main ()
(gdb)

供您参考,这是我的代码:http://sprunge.us/PYSO(我希望会持续一段时间,但如果它停止工作,请告诉我)。我的Makefile:http://sprunge.us/UCge和我使用$ gdb --args ./flashcard --docroot . --http-address 0.0.0.0 --http-port 9090

运行gdb

您可以看到第80行但不是83的输出,而gdb的回溯表明第81行(提交)是问题所在。如果我删除第81行以便事务因超出范围而提交,则存在同样的问题,但它来自事务的析构函数。

我使用Wt 3.3.4-4,gcc 5.1.0-5运行archlinux,使用-std=c++0x进行编译。

我唯一可以想象的是,是否存在与std :: vector的二进制不兼容性?

1 个答案:

答案 0 :(得分:0)

重新编译Wt应解决问题。不要使用通过archlinux(pacman)打包的Wt,而是从源代码编译Wt。

在某些地方可能存在ABI差异,应该通过使用相同的标准和升级库在您自己的机器上编译所有内容来解决。