2016-12-22 2 views
0

Dies macht mich verrückt. Hauptsächlich, weil es in 90% der Fälle passiert, aber gelegentlich kann ich es richtig machen.Erstellen eines boost :: asio :: ip :: udp :: socket Absturz in LIB nach der Aktualisierung von 1_55 auf 1_62 unter Windows

Also hier ist die Hintergrundgeschichte. Ich hatte boost 1_55 mit MSVC++ 2012 kompiliert und wir hatten es schon eine ganze Weile benutzt. Wir schalten endlich auf die 2013 Toolchain um und ich wurde damit beauftragt, alles zu verbessern.

Ich wählte den neuesten Boost 1_62 und kompiliere mit dem 2013-32-Bit-Toolset. Das Problem, das ich habe, ist, dass jetzt, wo ich neu kompiliert habe ich einen Absturz beim Erstellen eines Udp-Sockets bekomme.

Also habe ich eine Bibliothek, die wir entwickelt haben, dass wir statisch verknüpfen. Ich erben von dieser Bibliothek und rufen eine Methode auf, die einen UDP-Port öffnet.

Aus Gründen des Beispiels ich meinen Code am besten verändert haben, diesen Punkt illistrate:

Im Klassenkonstruktor ich folgendes haben:

 boost::asio::io_service test; 
     boost::asio::ip::udp::socket socket(test); 

     this->StartListen(); 

Das funktioniert gut. In Startlisten, nenne ich Init ich habe folgendes:

 boost::asio::ip::udp::endpoint listen_endpoint(
     boost::asio::ip::address::from_string(m_bindAddress), m_usPort); 
    m_mcast_endpoint.reset(new boost::asio::ip::udp::endpoint(
     boost::asio::ip::address::from_string(m_sendAddress), m_usPort)); 
    m_socket.reset(new boost::asio::ip::udp::socket(m_ioservice)); 

Das sprengt auf dem m_socket.reset mit diesem:

Unhandled exception at 0x77D798C1 (ntdll.dll) in program.exe: 0xC0000374: A heap has been corrupted (parameters: 0x77DAC8D0). 

Interestly genug, wenn ich das Beispiel änderte die unmittelbar in der Start zu sein hören wie folgt aus:

void Multicast::StartListen() 
{ 
    boost::asio::io_service take2; 
    boost::asio::ip::udp::socket socket_test(take2); 

ich dieses:

Unhandled exception at 0x6384D4A1 in program.exe: 0xC00001A5: An invalid exception handler routine has been detected (parameters: 0x00000003). 

Ich habe wirklich keine Ahnung, was hier vor sich geht. Ich baute Schub mit dem

b2.exe --build-type = komplettes --stagedir = bin32 Adresse-Modell = 32 Stufe

und alles in Ordnung zu sein scheinen. Was vermisse ich?

Nun, ich habe mehr Fortschritte gemacht. Das Problem tritt auf, wenn Sie einen Boost-UDP-Socket in einer Bibliothek erstellen und einen Boost-UDP-Socket im Code erstellen, der die Bibliothek aufruft.

So: 
Main 
| 
| Create UDP Socket 
| 
CALL LIBRARY 
| 
| 
| Create UDP SOCKET <--- Heap corruption 

Antwort

0

Das Problem mit Boost.Asio war und es aus zwei separaten Projekten verwenden. Durch das Setzen der BOOST_ASIO_DISABLE_IOCP-Definition in beiden Projekteigenschaften wurde das Problem behoben. Es gibt wahrscheinlich einen "besseren Weg", um IOCP zu verwenden, aber das hat es gelöst.

1

Vielleicht kompilieren Sie mit Header von 1_55 aber Link mit Libs von 1_62

+0

Dachte ich, das Verzeichnis umbenannt die 1_55 Header waren in. Was ich dachte, es repariert, wie es nach einer Neukompilierung funktionierte. Einmal, dann drücken Sie den Fehler das nächste Mal durch. Es ist ein echter Kopfschaber. – PhilD

+0

Nein, ich blies die alten 1_55 Header und Bibliotheken weg, immer noch das gleiche Ergebnis. Ich habe eine kleine Testanwendung zusammengestellt, die versucht, sie neu zu erstellen, und sie zeigt nicht das gleiche Verhalten. Ich werde Teile meiner Bewerbung langsam wegschneiden müssen, bis ich herausgefunden habe, was es ist, denke ich. – PhilD

+0

Ich habe keine anderen Ideen zu diesem Problem, sagen Sie mir, warum, wenn Sie das Problem lösen,^_^ – ERWIN

Verwandte Themen