std::cerr в linux с clang++ и libc++ вызывает SIGABRT

Я пытаюсь запустить простую программу на Ubuntu 12.04 x64, скомпилированную с clang++ 3.3 libc++ libc++abi .

Программа:

#include <iostream>
int main(int argc, char **argv) {
  try {
    std::cerr << "Test cerr \n";
  } catch (...) {
    std::cout << "catch exception";
  }
  return 0;
}

Запись в std::cerr выводит сообщение, но приводит к SIGABRT.

Однако запись в std::cout работает нормально.

Вот вывод ldd исполняемого файла:

$ldd cerr_test
linux-vdso.so.1 =>  (0x00007fffce5ff000)
libc++abi.so.1 => /usr/local/lib/libc++abi.so.1 (0x00007fa4079fd000)
libc++.so.1 => /usr/local/lib/libc++.so.1 (0x00007fa407759000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fa40745c000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fa407246000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa406e87000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fa406c69000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fa406a61000)
/lib64/ld-linux-x86-64.so.2 (0x00007fa407c55000)

Может ли кто-нибудь дать мне подсказку, как это исправить?

Вот обратная связь:

[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Test cerr

Program received signal SIGABRT, Aborted.
0x00007ffff704e425 in raise () from /lib/x86_64-linux-gnu/libc.so.6
(gdb) backtrace
#0  0x00007ffff704e425 in raise () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x00007ffff7051b8b in abort () from /lib/x86_64-linux-gnu/libc.so.6
#2  0x00007ffff792a437 in std::uncaught_exception() () from /usr/local/lib/libc++.so.1
#3  0x00007ffff79324e2 in std::__1::basic_ostream<char, std::__1::char_traits<char> >::sentry::~sentry() ()
   from /usr/local/lib/libc++.so.1
#4  0x000000000040118e in std::__1::operator<< <std::__1::char_traits<char> > (__os=..., __str=0x401784 "Test cerr \n")
    at /usr/local/include/c++/v1/ostream:990
#5  0x0000000000400d41 in main (argc=1, argv=0x7fffffffe728) at cerr_test.cpp:5
(gdb)

person Aco Mitevski    schedule 11.07.2013    source источник
comment
Вы можете скомпилировать с отладкой и трассировкой стека после сбоя?   -  person bobah    schedule 11.07.2013
comment
Конечно. просто добавил бэктрек к сообщению   -  person Aco Mitevski    schedule 11.07.2013
comment
В моей системе Linux (32-разрядная версия gcc 4.7 и clang 3.2) все работает нормально. Какие варианты компиляции вы используете?   -  person Claudio    schedule 11.07.2013
comment
также чтобы не. включение вызова std::cerr с блоком try catch приводит к той же обратной трассировке... он по-прежнему говорит std:: uncaught_exception..   -  person Aco Mitevski    schedule 11.07.2013
comment
Я компилирую его с помощью clang++ -std=c++11 -stdlib=libc++ -o cerr_test cerr_test.cpp -L /usr/local/lib/ -lc++abi -I /usr/local/include/c++/v1/ -ностдинc++ . Я скомпилировал clang и libc++ в соответствии с этим постом plus.google.com/u/ 0/+ДеВиттКлинтон/posts/Vr7y8TPsKgR   -  person Aco Mitevski    schedule 11.07.2013
comment
можете ли вы обновить свой код с помощью try/catch именно так, как вы это делаете?   -  person bobah    schedule 11.07.2013
comment
да, только что обновил код.   -  person Aco Mitevski    schedule 11.07.2013
comment
как предложено здесь (stackoverflow.com/a/16274107), я рекомендую libcxxrt для Linux.   -  person pepper_chico    schedule 11.07.2013
comment
Когда вы собрали libc++, выдавало ли это предупреждение: #warning uncaught_exception not yet implemented?   -  person Howard Hinnant    schedule 11.07.2013
comment
только что снова начал сборку, и да, есть предупреждение. Есть ли способ обойти это?   -  person Aco Mitevski    schedule 11.07.2013
comment
да. Реализуйте это. ;-) Проще сказать, чем сделать. :-( Есть предложение использовать libcxxrt в linux. Я предполагаю, что libcxxrt реализует uncaught_exception в linux.   -  person Howard Hinnant    schedule 12.07.2013


Ответы (1)


Наконец, он работает, используя libcxxrt вместо libc++abi, как это было предложено @chico.

person Aco Mitevski    schedule 11.07.2013