ORM 事务提交上的 Wt Segfault
Wt Segfault on ORM Transaction Commit
http://www.webtoolkit.eu/wt/doc/tutorial/dbo.html 说
The complete source code for the examples used in this tutorial are available as ready-to-run programs in the examples/feature/dbo/
folder of Wt.
我正在尝试从该目录 运行 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 (I hope that lasts for a while, but let me know if it stops working). And my Makefile: http://sprunge.us/UCge 和我 运行 gdb 使用 $ gdb --args ./flashcard --docroot . --http-address 0.0.0.0 --http-port 9090
您可以看到第 80 行的输出,但看不到第 83 行的输出,gdb 的回溯表明第 81 行(提交)是问题所在。如果我删除第 81 行以便 t运行saction 由于超出范围而提交,则存在相同的问题,但它来自 t运行saction.
的析构函数
我正在 运行使用 Wt 3.3.4-4、gcc 5.1.0-5 和 -std=c++0x
.
编译 archlinux
我唯一能想到的是,如果二进制文件与 std::vector 不兼容?
重新编译 Wt 应该可以解决问题。不要使用通过 archlinux (pacman) 打包的 Wt,而是从源代码编译 Wt。
可能某处存在 ABI 差异,应该通过在您自己的机器上使用相同的标准库和 boost 库编译所有内容来解决。
http://www.webtoolkit.eu/wt/doc/tutorial/dbo.html 说
The complete source code for the examples used in this tutorial are available as ready-to-run programs in the
examples/feature/dbo/
folder of Wt.
我正在尝试从该目录 运行 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 (I hope that lasts for a while, but let me know if it stops working). And my Makefile: http://sprunge.us/UCge 和我 运行 gdb 使用 $ gdb --args ./flashcard --docroot . --http-address 0.0.0.0 --http-port 9090
您可以看到第 80 行的输出,但看不到第 83 行的输出,gdb 的回溯表明第 81 行(提交)是问题所在。如果我删除第 81 行以便 t运行saction 由于超出范围而提交,则存在相同的问题,但它来自 t运行saction.
的析构函数我正在 运行使用 Wt 3.3.4-4、gcc 5.1.0-5 和 -std=c++0x
.
我唯一能想到的是,如果二进制文件与 std::vector 不兼容?
重新编译 Wt 应该可以解决问题。不要使用通过 archlinux (pacman) 打包的 Wt,而是从源代码编译 Wt。
可能某处存在 ABI 差异,应该通过在您自己的机器上使用相同的标准库和 boost 库编译所有内容来解决。