странность libpion-net
От: real_sba http://cellwar.xyz/
Дата: 14.03.13 17:33
Оценка:
Доброго времени суток!

Используемая версия 4.0.7+dfsg-3.1

Приложение собраное с -std=c++11 не работает и крашится в кишках библиотеки.
Если собирать с -std=c++98 — все работает.

Как правильно разрулить ситуацию?


#include <pion/net/HTTPServer.hpp>
#include <pion/net/HTTPTypes.hpp>
#include <pion/net/HTTPResponseWriter.hpp>

using namespace pion;
using namespace pion::net;
using namespace boost;

void handleRootURI(HTTPRequestPtr& http_request, TCPConnectionPtr& tcp_conn) { }

HTTPServer server;

int main(int argc, char** argv) {
  server.setAddress(asio::ip::address::from_string("127.0.0.1"));
  server.setPort(8081);
  server.addResource("/", &handleRootURI);
  server.start();
  sleep(3);
  server.stop();

  return 0;
}
Re: странность libpion-net
От: niXman Ниоткуда https://github.com/niXman
Дата: 15.03.13 18:33
Оценка:
Здравствуйте, real_sba, Вы писали:

_>Как правильно разрулить ситуацию?

для начала, привести backtrace.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[2]: странность libpion-net
От: real_sba http://cellwar.xyz/
Дата: 19.03.13 13:35
Оценка:
Здравствуйте, niXman, Вы писали:

X>для начала, привести backtrace.


Извиняюсь, приведенный ранее пример не воспроизводит креш. Но все равно не работает как положено.
При компиляции с опцией -std=c++11 происходит непонятный сбой внутри server.stop(), полагаю зацикливание.
После входа в stop() загрузка процессора возростает до 100%.

собираю так
g++     -o dist/Debug/GNU-Linux-x86/test-pion build/Debug/GNU-Linux-x86/main.o -lboost_system -lboost_thread -lpion-common -lpion-net -llog4cpp

Вот backtrace из работающего приложения
#0  0x000000000044b320 in boost::asio::detail::op_queue_access::next<boost::asio::detail::task_io_service_operation, boost::asio::detail::task_io_service_operation> (o1=@0x1e48780:
 0x1, o2=0x1e6b730) at /usr/include/boost/asio/detail/op_queue.hpp:41
#1  0x000000000044a158 in boost::asio::detail::op_queue<boost::asio::detail::task_io_service_operation>::push<boost::asio::detail::task_io_service_operation> (this=0x1e48778, q=...
) at /usr/include/boost/asio/detail/op_queue.hpp:127
#2  0x000000000044865c in boost::asio::detail::task_io_service::post_deferred_completions (this=0x1e486f0, ops=...) at /usr/include/boost/asio/detail/impl/task_io_service.ipp:309
#3  0x0000000000494736 in boost::asio::detail::epoll_reactor::deregister_descriptor (this=0x1e48820, descriptor=13, descriptor_data=@0x752768: 0x0, closing=true) at /usr/include/bo
ost/asio/detail/impl/epoll_reactor.ipp:315
#4  0x00007f8120c908a0 in boost::asio::detail::reactive_socket_service_base::close(boost::asio::detail::reactive_socket_service_base::base_implementation_type&, boost::system::erro
r_code&) () from /usr/lib/libpion-net-4.0.so
#5  0x00007f8120c93d3f in boost::asio::basic_socket_acceptor<boost::asio::ip::tcp, boost::asio::socket_acceptor_service<boost::asio::ip::tcp> >::close() () from /usr/lib/libpion-ne
t-4.0.so
#6  0x00007f8120c89eb6 in pion::net::TCPServer::stop(bool) () from /usr/lib/libpion-net-4.0.so
#7  0x0000000000491bd4 in TermHandler () at src/main.cpp:101
#8  <signal handler called>
#9  0x00007f811ea9e2d4 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib/x86_64-linux-gnu/libpthread.so.0
#10 0x00007f8120c895a6 in pion::net::TCPServer::join() () from /usr/lib/libpion-net-4.0.so
#11 0x000000000049247d in main (argc=1, argv=0x7fff90cb6308) at src/main.cpp:202
Re[3]: странность libpion-net
От: niXman Ниоткуда https://github.com/niXman
Дата: 19.03.13 13:37
Оценка:
Здравствуйте, real_sba, Вы писали:

_>#8 <signal handler called>


какой сигнал пришел?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[3]: странность libpion-net
От: niXman Ниоткуда https://github.com/niXman
Дата: 19.03.13 13:38
Оценка:
можешь показать код, который создает эту проблему? желательно, компилябельный.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[4]: странность libpion-net
От: real_sba http://cellwar.xyz/
Дата: 19.03.13 13:58
Оценка:
Здравствуйте, niXman, Вы писали:

пришел SIGINT (я с консоли его отправил).

X>можешь показать код, который создает эту проблему? желательно, компилябельный.

Весь код не показать. Буду стараться со временем привести пример который все-таки крашится.
Суть того что есть сейчас такова, но опять же не крашится, а только выснет намертво после
входа в server.stop().

#include <pion/net/HTTPServer.hpp>

using namespace pion;
using namespace pion::net;
using namespace boost;

HTTPServer server;

void TermHandler(int) {
  server.stop();
}

void handleRootURI(HTTPRequestPtr& http_request, TCPConnectionPtr& tcp_conn) { }

int main(int argc, char** argv) {

  struct sigaction sa;
  sa.sa_handler = TermHandler;
  sa.sa_flags   = 0;
  sigemptyset(&sa.sa_mask);
  sigaction(SIGTERM, &sa, 0);
  sigaction(SIGINT,  &sa, 0);

  server.setAddress(asio::ip::address::from_string("127.0.0.1"));
  server.setPort(8081);
  server.addResource("/", &handleRootURI);
  server.start();
  server.join();

  return 0;
}


я поэтому и спрашиваю именно о пионе, так как даже такой минимальный пример с -std=c++11 не работает, а с -std=c++98 — работает. Основное же приложение, которое ранее компилилось с опцией -std=c++98, работает месяцами, а с -std=c++11 не принимает входящие соединения (суть та же, при входещем соединении загрузка проца возростает до 100% и приложение виснет намертво) и при выходе крашится.
Re[5]: странность libpion-net
От: niXman Ниоткуда https://github.com/niXman
Дата: 19.03.13 14:02
Оценка: 2 (1)
Здравствуйте, real_sba, Вы писали:

_>пришел SIGINT (я с консоли его отправил).

ясно.

_>Суть того что есть сейчас такова, но опять же не крашится, а только выснет намертво после

_>входа в server.stop().

это пробовал? если есть зацикливание, ты поймешь.
да и просто, может быть порядок вызовов хендлеров о чем-то скажет...

и да, без примера воспроизводящего проблему, гадать можно долго %)
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[6]: странность libpion-net
От: real_sba http://cellwar.xyz/
Дата: 19.03.13 14:27
Оценка:
Здравствуйте, niXman, Вы писали:

X>это пробовал? если есть зацикливание, ты поймешь.

X>да и просто, может быть порядок вызовов хендлеров о чем-то скажет...
Только что попробовал на тестовом примере. Вызов server.start() сегфолтится на обоих конфигурациях (-std=c++98, -std=c++11).

X>и да, без примера воспроизводящего проблему, гадать можно долго %)

Так пример выше. Перефразирую тогда вопрос и проблему.
Даже минимальное приложение которое ничего не должно делать кроме как принимать входящие соединения
#include <pion/net/HTTPServer.hpp>
#include <iostream>

using namespace pion;
using namespace pion::net;
using namespace boost;

HTTPServer server;

void handleRootURI(HTTPRequestPtr& http_request, TCPConnectionPtr& tcp_conn) {
  std::cout << "test" << std::endl;
}

int main(int argc, char** argv) {
  server.setAddress(asio::ip::address::from_string("127.0.0.1"));
  server.setPort(8080);
  server.addResource("/", &handleRootURI);
  server.start();
  server.join();

  return 0;
}

с опцией -std=c++98 работает ожидаемо, то-есть принимает соединения, печатает "test", не создает какую либо ощутимую нагрузку на процессор.
Тот же код, собранный с опцией -std=c++11, в режиме ожидания никак себя не проявляет, а стоит только получить первое входящее соединение — загружает проц на 100%, и не печатает ничего в консоль. Конечно же не крашится.... но я бы сказал — все равно слегка работает не так как надо.
Re[7]: странность libpion-net
От: niXman Ниоткуда https://github.com/niXman
Дата: 19.03.13 14:44
Оценка:
Здравствуйте, real_sba, Вы писали:

_>Только что попробовал на тестовом примере. Вызов server.start() сегфолтится на обоих конфигурациях (-std=c++98, -std=c++11).

и никакого трекинга хендлеров не видно? оО

X>>и да, без примера воспроизводящего проблему, гадать можно долго %)

_>Так пример выше. Перефразирую тогда вопрос и проблему.
_>Даже минимальное приложение которое ничего не должно делать кроме как принимать входящие соединения

_>с опцией -std=c++98 работает ожидаемо, то-есть принимает соединения, печатает "test", не создает какую либо ощутимую нагрузку на процессор.

_>Тот же код, собранный с опцией -std=c++11, в режиме ожидания никак себя не проявляет, а стоит только получить первое входящее соединение — загружает проц на 100%, и не печатает ничего в консоль. Конечно же не крашится.... но я бы сказал — все равно слегка работает не так как надо.
понял
завтра с утра попробую разобраться.
кстати, libpion ты сам собирал? или из менеджера пакетов? тогда укажи версию libpion и boost.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[8]: странность libpion-net
От: real_sba http://cellwar.xyz/
Дата: 19.03.13 15:17
Оценка:
Здравствуйте, niXman, Вы писали:

_>>Только что попробовал на тестовом примере. Вызов server.start() сегфолтится на обоих конфигурациях (-std=c++98, -std=c++11).

X>и никакого трекинга хендлеров не видно? оО
не видно, код сегфолтится прямо в server.start(), так что до хендлеров еще не дошло

X>кстати, libpion ты сам собирал? или из менеджера пакетов? тогда укажи версию libpion и boost.

Все библиотеки из менеджера пакетов.
Debian testing.
boost: 1.49.0-3.2
libpion-common-4.0: 4.0.7+dfsg-3.1
libpion-net-4.0: 4.0.7+dfsg-3.1
libpion-net-dev: 4.0.7+dfsg-3.1
liblog4cpp5: 1.0-4
Re[9]: странность libpion-net
От: niXman Ниоткуда https://github.com/niXman
Дата: 21.03.13 20:58
Оценка:
Здравствуйте, real_sba, Вы писали:

_>Все библиотеки из менеджера пакетов.

_>Debian testing.
_>boost: 1.49.0-3.2
_>libpion-common-4.0: 4.0.7+dfsg-3.1
_>libpion-net-4.0: 4.0.7+dfsg-3.1
_>libpion-net-dev: 4.0.7+dfsg-3.1
_>liblog4cpp5: 1.0-4

до самоличной проверки твоей ситуации я все таки не добрался, но читая список рассылки совсем о другой проблеме, вспомнил, что использование '-std=с++11' ломает ABI предыдущего стандарта.
поэтому, предлагаю чтоб ты пересобрал используемые библиотеки.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.