¿Cómo detectar un comportamiento extraño indefinido en el código C ++?

Tengo un comportamiento extraño en el progtwig del servidor. En el ejemplo simple funciona bien (inserto trazas en todas partes, en pion y asio).

#include  #include  #include  #include  #include  #include  int main() { pion::single_service_scheduler shed; shed.set_num_threads(1); boost::shared_ptr server (new pion::http::server(shed, 5000)); server->add_resource("/", handlerFunction); server->start(); sleep(5); } 

La salida es así. Construya el socket para el aceptador, construya el socket para el cliente, se crea la conexión tcp, todo funciona bien.

 basic io object constructor after service construct basic io object constructor after service construct basic io object constructor Address of socket is: 0x9855fa4 value: -1 after service construct 1422519945 INFO pion.http.server Added request handler for HTTP resource: 1422519945 INFO pion.http.server Starting server on port 5000 before connection create before connection constructor called basic io object constructor basic_stream_socket::construct Address of socket is: 0x9857514 value: -1 after impl.construct after service construct basic io object constructor after service construct basic io object constructor after service construct ssl socket constructed connection constructor, is_ssl: 0 after connection create: 0x98574f8 before accept after accept 

En un progtwig más complicado con el mismo código, pero con Oracle y muchas otras bibliotecas, la salida es así.

 basic io object constructor after service construct basic io object constructor after service construct basic io object constructor Address of socket is: 0xbfe47a64 value: -1 after service construct 1422525476 INFO pion.http.server Added request handler for HTTP resource: before connection create basic io object constructor after service construct basic io object constructor after service construct after connection create: 0x8fe8b88 before accept in connection::async_accept after accept 

No se ha creado un segundo socket, en realidad, no hay llamada de connection::create , pero la conexión tiene la dirección que puede ver. Tengo la idea de que en algún lugar algo escribe sobre la dirección de la connection::create de la función connection::create (o algo así). ¿Puedes por favor ayudar, cómo puedo atrapar esto?

En ubuntu, me gusta correr con valgrind ( http://valgrind.org/ ).

 sudo apt-get install valgrind valgrind ./mypgrogram 

No informa todos los problemas, pero cuando lo haga, informará la naturaleza y el origen.

También se recomienda:

 valgrind --db-attach=yes ./myprogram 

Lo que le permite depurar (realizar un seguimiento, inspeccionar) y continuar el progtwig cuando se detecta una referencia de memoria no iniciada / violación.

En algunos Ubunti más antiguos tuve que usar sudo para hacer que valgrind pudiera adjuntar gdb :

 sudo -E valgrind --db-attach=yes ./myprogram 

Si tr1/unordered_map debería ser bastante trivial para reemplazarlo con std::unordered_map

Por ejemplo, con un corte rápido.

 #include  namespace std { namespace tr1 { using std::unordered_map; using std::hash; // etc... } } 

Por supuesto, esto no es una buena práctica, y es posible que solo quieras tipearf entre std::tr1::unordered_map y std::tr1::unordered_map , pero en el interés de verificaciones rápidas …