http://www.webtoolkit.eu/wt/doc/tutorial/dbo.html говорит
Полный исходный код примеров, используемых в этом руководстве, доступен в виде готовых к запуску программ в
examples/feature/dbo/
папка 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 (Я надеюсь, что это продлится какое-то время, но дайте мне знать, если он перестанет работать). И мой Makefile: http://sprunge.us/UCge и я запустил GDB, используя $ gdb --args ./flashcard --docroot . --http-address 0.0.0.0 --http-port 9090
Вы можете видеть выходные данные из строки 80, но не из 83, а обратный след из gdb предполагает, что проблема в строке 81 (commit). Если я удалю строку 81, чтобы транзакция зафиксировалась из-за выхода из области видимости, та же проблема существует, но она исходит от деструктора транзакции.
Я запускаю archlinux с Wt 3.3.4-4, gcc 5.1.0-5, компилирую с -std=c++0x
,
Единственное, что я могу себе представить, это наличие какой-либо двоичной несовместимости с std :: vector?
Перекомпиляция Wt должна решить проблему. Вместо использования Wt, упакованного через archlinux (pacman), скомпилируйте Wt из исходного кода.
Возможно, где-то есть несоответствие ABI, которое следует устранить, компилируя все на своем компьютере с одинаковыми стандартами и библиотеками надстроек.