C++ Boost.Asio Segmentation Fault on async_write while accessing write-method through shared_ptr
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}
I created a static map that holds several Sessions of connected clients.
std::map<std::string, std::shared_ptr<Session>> Communication::m_appSockets;
The Listener that accepts incomming clients is implemented in the Communication class.
class Communication : public std::enable_shared_from_this<Communication>
{
private:
boost::asio::io_context m_ioc;
boost::asio::io_context::work m_work;
boost::asio::streambuf m_buffer;
boost::asio::ip::tcp::acceptor m_acceptor;
std::thread m_senderThread;
std::thread m_ioThread;
public:
static std::map<std::string, std::shared_ptr<Session>> m_appSockets;
Communication(uint16_t t_port);
void accept();
void doAccept();
void senderThread();
};
After accepting a client the method "doAccept" creates a session object and moves the socket like this
m_acceptor.async_accept(
[this](boost::system::error_code t_ec, boost::asio::ip::tcp::socket t_socket) {
if (!t_ec)
{
m_appSockets.emplace(std::pair<std::string, std::shared_ptr<Session>>(
"app0", std::make_shared<Session>(std::move(t_socket))));
m_appSockets["app0"]->start();
}
accept();
});
Session.h looks like this:
class Session : public std::enable_shared_from_this<Session>
{
private:
boost::asio::ip::tcp::socket m_socket;
boost::asio::streambuf m_buffer;
public:
Session(boost::asio::ip::tcp::socket t_socket);
void write(std::string &t_msg);
void doWrite(std::string &t_msg);
void start();
...
};
void start() is used for starting the async read on the socket, which is working fine.
A session object is created this way:
Session::Session(boost::asio::ip::tcp::socket t_socket) : m_socket(std::move(t_socket))
{}
What I need to do for my implementation is to access the write-method of session through the shared_ptr in the map of Communication.h.
I tried it the following way
void Communication::senderThread()
{
for (;;)
{
....
//blocking until queue holds a message
std::string buf = *message from queue*//pseudo code
m_appSockets["app0"].get()->write(buf);
}
}
A senderthread blocks until a message is available in a queue which will be forwarded to the write method of session
The write-method can be called but as soon as i try an operation on any member of the session it gives me a segmentation fault:
void Session::write(std::string &t_msg)
{
//here it crashes
m_socket.get_executor().context().post(std::bind(&Session::doWrite, shared_from_this(), t_msg));
}
void Session::doWrite(std::string &t_msg)
{
boost::asio::async_write(
m_socket, boost::asio::buffer(t_msg),
std::bind(&Session::onWrite, shared_from_this(), std::placeholders::_1, std::placeholders::_2));
}
It feels like the Session object runs out of scope as soon as I enter its method. I have tried creating dummy members in Session which all gave the same segmentation fault when accessing them.
Am I getting the shared_ptr/object lifetime wrong at some point?
Thank you very much in advance.
EDIT 1:
Running gdb ./programm.out core gave me this:
Thread 2 "programm.out" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff58f1700 (LWP 5651)] 0x0000555555605932 in
Session::write (this=0x0,
t_msg="{"destination":"app0"}")
at /usr/Sources/Session.cpp:58 58 std::cout << dummyMember << std::endl;
I added a member to Session (int dummyMember{5};).
How can it be that this is pointing to 0x0?
c++ segmentation-fault boost-asio shared-ptr
add a comment |
I created a static map that holds several Sessions of connected clients.
std::map<std::string, std::shared_ptr<Session>> Communication::m_appSockets;
The Listener that accepts incomming clients is implemented in the Communication class.
class Communication : public std::enable_shared_from_this<Communication>
{
private:
boost::asio::io_context m_ioc;
boost::asio::io_context::work m_work;
boost::asio::streambuf m_buffer;
boost::asio::ip::tcp::acceptor m_acceptor;
std::thread m_senderThread;
std::thread m_ioThread;
public:
static std::map<std::string, std::shared_ptr<Session>> m_appSockets;
Communication(uint16_t t_port);
void accept();
void doAccept();
void senderThread();
};
After accepting a client the method "doAccept" creates a session object and moves the socket like this
m_acceptor.async_accept(
[this](boost::system::error_code t_ec, boost::asio::ip::tcp::socket t_socket) {
if (!t_ec)
{
m_appSockets.emplace(std::pair<std::string, std::shared_ptr<Session>>(
"app0", std::make_shared<Session>(std::move(t_socket))));
m_appSockets["app0"]->start();
}
accept();
});
Session.h looks like this:
class Session : public std::enable_shared_from_this<Session>
{
private:
boost::asio::ip::tcp::socket m_socket;
boost::asio::streambuf m_buffer;
public:
Session(boost::asio::ip::tcp::socket t_socket);
void write(std::string &t_msg);
void doWrite(std::string &t_msg);
void start();
...
};
void start() is used for starting the async read on the socket, which is working fine.
A session object is created this way:
Session::Session(boost::asio::ip::tcp::socket t_socket) : m_socket(std::move(t_socket))
{}
What I need to do for my implementation is to access the write-method of session through the shared_ptr in the map of Communication.h.
I tried it the following way
void Communication::senderThread()
{
for (;;)
{
....
//blocking until queue holds a message
std::string buf = *message from queue*//pseudo code
m_appSockets["app0"].get()->write(buf);
}
}
A senderthread blocks until a message is available in a queue which will be forwarded to the write method of session
The write-method can be called but as soon as i try an operation on any member of the session it gives me a segmentation fault:
void Session::write(std::string &t_msg)
{
//here it crashes
m_socket.get_executor().context().post(std::bind(&Session::doWrite, shared_from_this(), t_msg));
}
void Session::doWrite(std::string &t_msg)
{
boost::asio::async_write(
m_socket, boost::asio::buffer(t_msg),
std::bind(&Session::onWrite, shared_from_this(), std::placeholders::_1, std::placeholders::_2));
}
It feels like the Session object runs out of scope as soon as I enter its method. I have tried creating dummy members in Session which all gave the same segmentation fault when accessing them.
Am I getting the shared_ptr/object lifetime wrong at some point?
Thank you very much in advance.
EDIT 1:
Running gdb ./programm.out core gave me this:
Thread 2 "programm.out" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff58f1700 (LWP 5651)] 0x0000555555605932 in
Session::write (this=0x0,
t_msg="{"destination":"app0"}")
at /usr/Sources/Session.cpp:58 58 std::cout << dummyMember << std::endl;
I added a member to Session (int dummyMember{5};).
How can it be that this is pointing to 0x0?
c++ segmentation-fault boost-asio shared-ptr
add a comment |
I created a static map that holds several Sessions of connected clients.
std::map<std::string, std::shared_ptr<Session>> Communication::m_appSockets;
The Listener that accepts incomming clients is implemented in the Communication class.
class Communication : public std::enable_shared_from_this<Communication>
{
private:
boost::asio::io_context m_ioc;
boost::asio::io_context::work m_work;
boost::asio::streambuf m_buffer;
boost::asio::ip::tcp::acceptor m_acceptor;
std::thread m_senderThread;
std::thread m_ioThread;
public:
static std::map<std::string, std::shared_ptr<Session>> m_appSockets;
Communication(uint16_t t_port);
void accept();
void doAccept();
void senderThread();
};
After accepting a client the method "doAccept" creates a session object and moves the socket like this
m_acceptor.async_accept(
[this](boost::system::error_code t_ec, boost::asio::ip::tcp::socket t_socket) {
if (!t_ec)
{
m_appSockets.emplace(std::pair<std::string, std::shared_ptr<Session>>(
"app0", std::make_shared<Session>(std::move(t_socket))));
m_appSockets["app0"]->start();
}
accept();
});
Session.h looks like this:
class Session : public std::enable_shared_from_this<Session>
{
private:
boost::asio::ip::tcp::socket m_socket;
boost::asio::streambuf m_buffer;
public:
Session(boost::asio::ip::tcp::socket t_socket);
void write(std::string &t_msg);
void doWrite(std::string &t_msg);
void start();
...
};
void start() is used for starting the async read on the socket, which is working fine.
A session object is created this way:
Session::Session(boost::asio::ip::tcp::socket t_socket) : m_socket(std::move(t_socket))
{}
What I need to do for my implementation is to access the write-method of session through the shared_ptr in the map of Communication.h.
I tried it the following way
void Communication::senderThread()
{
for (;;)
{
....
//blocking until queue holds a message
std::string buf = *message from queue*//pseudo code
m_appSockets["app0"].get()->write(buf);
}
}
A senderthread blocks until a message is available in a queue which will be forwarded to the write method of session
The write-method can be called but as soon as i try an operation on any member of the session it gives me a segmentation fault:
void Session::write(std::string &t_msg)
{
//here it crashes
m_socket.get_executor().context().post(std::bind(&Session::doWrite, shared_from_this(), t_msg));
}
void Session::doWrite(std::string &t_msg)
{
boost::asio::async_write(
m_socket, boost::asio::buffer(t_msg),
std::bind(&Session::onWrite, shared_from_this(), std::placeholders::_1, std::placeholders::_2));
}
It feels like the Session object runs out of scope as soon as I enter its method. I have tried creating dummy members in Session which all gave the same segmentation fault when accessing them.
Am I getting the shared_ptr/object lifetime wrong at some point?
Thank you very much in advance.
EDIT 1:
Running gdb ./programm.out core gave me this:
Thread 2 "programm.out" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff58f1700 (LWP 5651)] 0x0000555555605932 in
Session::write (this=0x0,
t_msg="{"destination":"app0"}")
at /usr/Sources/Session.cpp:58 58 std::cout << dummyMember << std::endl;
I added a member to Session (int dummyMember{5};).
How can it be that this is pointing to 0x0?
c++ segmentation-fault boost-asio shared-ptr
I created a static map that holds several Sessions of connected clients.
std::map<std::string, std::shared_ptr<Session>> Communication::m_appSockets;
The Listener that accepts incomming clients is implemented in the Communication class.
class Communication : public std::enable_shared_from_this<Communication>
{
private:
boost::asio::io_context m_ioc;
boost::asio::io_context::work m_work;
boost::asio::streambuf m_buffer;
boost::asio::ip::tcp::acceptor m_acceptor;
std::thread m_senderThread;
std::thread m_ioThread;
public:
static std::map<std::string, std::shared_ptr<Session>> m_appSockets;
Communication(uint16_t t_port);
void accept();
void doAccept();
void senderThread();
};
After accepting a client the method "doAccept" creates a session object and moves the socket like this
m_acceptor.async_accept(
[this](boost::system::error_code t_ec, boost::asio::ip::tcp::socket t_socket) {
if (!t_ec)
{
m_appSockets.emplace(std::pair<std::string, std::shared_ptr<Session>>(
"app0", std::make_shared<Session>(std::move(t_socket))));
m_appSockets["app0"]->start();
}
accept();
});
Session.h looks like this:
class Session : public std::enable_shared_from_this<Session>
{
private:
boost::asio::ip::tcp::socket m_socket;
boost::asio::streambuf m_buffer;
public:
Session(boost::asio::ip::tcp::socket t_socket);
void write(std::string &t_msg);
void doWrite(std::string &t_msg);
void start();
...
};
void start() is used for starting the async read on the socket, which is working fine.
A session object is created this way:
Session::Session(boost::asio::ip::tcp::socket t_socket) : m_socket(std::move(t_socket))
{}
What I need to do for my implementation is to access the write-method of session through the shared_ptr in the map of Communication.h.
I tried it the following way
void Communication::senderThread()
{
for (;;)
{
....
//blocking until queue holds a message
std::string buf = *message from queue*//pseudo code
m_appSockets["app0"].get()->write(buf);
}
}
A senderthread blocks until a message is available in a queue which will be forwarded to the write method of session
The write-method can be called but as soon as i try an operation on any member of the session it gives me a segmentation fault:
void Session::write(std::string &t_msg)
{
//here it crashes
m_socket.get_executor().context().post(std::bind(&Session::doWrite, shared_from_this(), t_msg));
}
void Session::doWrite(std::string &t_msg)
{
boost::asio::async_write(
m_socket, boost::asio::buffer(t_msg),
std::bind(&Session::onWrite, shared_from_this(), std::placeholders::_1, std::placeholders::_2));
}
It feels like the Session object runs out of scope as soon as I enter its method. I have tried creating dummy members in Session which all gave the same segmentation fault when accessing them.
Am I getting the shared_ptr/object lifetime wrong at some point?
Thank you very much in advance.
EDIT 1:
Running gdb ./programm.out core gave me this:
Thread 2 "programm.out" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff58f1700 (LWP 5651)] 0x0000555555605932 in
Session::write (this=0x0,
t_msg="{"destination":"app0"}")
at /usr/Sources/Session.cpp:58 58 std::cout << dummyMember << std::endl;
I added a member to Session (int dummyMember{5};).
How can it be that this is pointing to 0x0?
c++ segmentation-fault boost-asio shared-ptr
c++ segmentation-fault boost-asio shared-ptr
edited Nov 22 '18 at 13:19
UltraGeralt
asked Nov 22 '18 at 9:44
UltraGeraltUltraGeralt
32
32
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
Below line is suspicious
boost::asio::buffer(t_msg)
asio::buffer
returns object which holds a pointer to the content of string and length of string (a copy of t_msg
is not created). You have to be careful when using asio::buffer
with asynchronous operations because its return type is pair (pointer,length) to string, it doesn't extend the lifetime of string.
async_write
function returns immediately and we don't know when handler will be called, so you have to make sure that msg
is valid until handler is called.
for(;;)
{
std::string buf = *message from queue*//pseudo code
m_appSockets["app0"].get()->write(buf);
// if you want to send original buf string
// before this loop ends all asynchronous operation writing buf must be complete
}
If your goal is to send msg
you have missed to use ref
wrapper, because bind
takes parameters by value by default.
std::bind(&Session::doWrite, shared_from_this(), t_msg) // make copy of t_msg
above creates callback which holds copy of t_msg
.
When this callback is called copy of t_msg
is passed into boost::asio::buffer(t_msg)
in Session::doWrite
. Probably, before callback created by std::bind(&Session::onWrite, shared_from_this(), std::placeholders::_1, std::placeholders::_2)
is executed string copy is destroyed and buffer
points to deleted data.
You can rewrite Session::write
method using std::ref
:
m_socket.get_executor().context().post(std::bind(&Session::doWrite, shared_from_this(), std::ref(t_msg)));
and ensure that all asynchronous operations which write this string are complete until for
loop ends in senderThread
. Or you need to find another way to hold t_msg
string while asynchronous operations are executed.
Thank you very much for your answer. Indeed this is a problem I have. I adapted my code but this doesn't fix the segmentation fault. The error occurs already in in write() before doWrite() is reached. For example: If I add a member int dummy{5}; to session and try access it through a getter method at the beginning of write() I already get the segmentation fault.
– UltraGeralt
Nov 22 '18 at 10:49
1
Thanks for your answer which would have let to mistakes later on. I accessed the map in a seperate thread before the async accept created the session in the map, as we got the "this" pointing to 0x0 in the core dump. Making sure the object is created first fixed the problem.
– UltraGeralt
Nov 22 '18 at 13:42
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53427997%2fc-boost-asio-segmentation-fault-on-async-write-while-accessing-write-method-th%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
Below line is suspicious
boost::asio::buffer(t_msg)
asio::buffer
returns object which holds a pointer to the content of string and length of string (a copy of t_msg
is not created). You have to be careful when using asio::buffer
with asynchronous operations because its return type is pair (pointer,length) to string, it doesn't extend the lifetime of string.
async_write
function returns immediately and we don't know when handler will be called, so you have to make sure that msg
is valid until handler is called.
for(;;)
{
std::string buf = *message from queue*//pseudo code
m_appSockets["app0"].get()->write(buf);
// if you want to send original buf string
// before this loop ends all asynchronous operation writing buf must be complete
}
If your goal is to send msg
you have missed to use ref
wrapper, because bind
takes parameters by value by default.
std::bind(&Session::doWrite, shared_from_this(), t_msg) // make copy of t_msg
above creates callback which holds copy of t_msg
.
When this callback is called copy of t_msg
is passed into boost::asio::buffer(t_msg)
in Session::doWrite
. Probably, before callback created by std::bind(&Session::onWrite, shared_from_this(), std::placeholders::_1, std::placeholders::_2)
is executed string copy is destroyed and buffer
points to deleted data.
You can rewrite Session::write
method using std::ref
:
m_socket.get_executor().context().post(std::bind(&Session::doWrite, shared_from_this(), std::ref(t_msg)));
and ensure that all asynchronous operations which write this string are complete until for
loop ends in senderThread
. Or you need to find another way to hold t_msg
string while asynchronous operations are executed.
Thank you very much for your answer. Indeed this is a problem I have. I adapted my code but this doesn't fix the segmentation fault. The error occurs already in in write() before doWrite() is reached. For example: If I add a member int dummy{5}; to session and try access it through a getter method at the beginning of write() I already get the segmentation fault.
– UltraGeralt
Nov 22 '18 at 10:49
1
Thanks for your answer which would have let to mistakes later on. I accessed the map in a seperate thread before the async accept created the session in the map, as we got the "this" pointing to 0x0 in the core dump. Making sure the object is created first fixed the problem.
– UltraGeralt
Nov 22 '18 at 13:42
add a comment |
Below line is suspicious
boost::asio::buffer(t_msg)
asio::buffer
returns object which holds a pointer to the content of string and length of string (a copy of t_msg
is not created). You have to be careful when using asio::buffer
with asynchronous operations because its return type is pair (pointer,length) to string, it doesn't extend the lifetime of string.
async_write
function returns immediately and we don't know when handler will be called, so you have to make sure that msg
is valid until handler is called.
for(;;)
{
std::string buf = *message from queue*//pseudo code
m_appSockets["app0"].get()->write(buf);
// if you want to send original buf string
// before this loop ends all asynchronous operation writing buf must be complete
}
If your goal is to send msg
you have missed to use ref
wrapper, because bind
takes parameters by value by default.
std::bind(&Session::doWrite, shared_from_this(), t_msg) // make copy of t_msg
above creates callback which holds copy of t_msg
.
When this callback is called copy of t_msg
is passed into boost::asio::buffer(t_msg)
in Session::doWrite
. Probably, before callback created by std::bind(&Session::onWrite, shared_from_this(), std::placeholders::_1, std::placeholders::_2)
is executed string copy is destroyed and buffer
points to deleted data.
You can rewrite Session::write
method using std::ref
:
m_socket.get_executor().context().post(std::bind(&Session::doWrite, shared_from_this(), std::ref(t_msg)));
and ensure that all asynchronous operations which write this string are complete until for
loop ends in senderThread
. Or you need to find another way to hold t_msg
string while asynchronous operations are executed.
Thank you very much for your answer. Indeed this is a problem I have. I adapted my code but this doesn't fix the segmentation fault. The error occurs already in in write() before doWrite() is reached. For example: If I add a member int dummy{5}; to session and try access it through a getter method at the beginning of write() I already get the segmentation fault.
– UltraGeralt
Nov 22 '18 at 10:49
1
Thanks for your answer which would have let to mistakes later on. I accessed the map in a seperate thread before the async accept created the session in the map, as we got the "this" pointing to 0x0 in the core dump. Making sure the object is created first fixed the problem.
– UltraGeralt
Nov 22 '18 at 13:42
add a comment |
Below line is suspicious
boost::asio::buffer(t_msg)
asio::buffer
returns object which holds a pointer to the content of string and length of string (a copy of t_msg
is not created). You have to be careful when using asio::buffer
with asynchronous operations because its return type is pair (pointer,length) to string, it doesn't extend the lifetime of string.
async_write
function returns immediately and we don't know when handler will be called, so you have to make sure that msg
is valid until handler is called.
for(;;)
{
std::string buf = *message from queue*//pseudo code
m_appSockets["app0"].get()->write(buf);
// if you want to send original buf string
// before this loop ends all asynchronous operation writing buf must be complete
}
If your goal is to send msg
you have missed to use ref
wrapper, because bind
takes parameters by value by default.
std::bind(&Session::doWrite, shared_from_this(), t_msg) // make copy of t_msg
above creates callback which holds copy of t_msg
.
When this callback is called copy of t_msg
is passed into boost::asio::buffer(t_msg)
in Session::doWrite
. Probably, before callback created by std::bind(&Session::onWrite, shared_from_this(), std::placeholders::_1, std::placeholders::_2)
is executed string copy is destroyed and buffer
points to deleted data.
You can rewrite Session::write
method using std::ref
:
m_socket.get_executor().context().post(std::bind(&Session::doWrite, shared_from_this(), std::ref(t_msg)));
and ensure that all asynchronous operations which write this string are complete until for
loop ends in senderThread
. Or you need to find another way to hold t_msg
string while asynchronous operations are executed.
Below line is suspicious
boost::asio::buffer(t_msg)
asio::buffer
returns object which holds a pointer to the content of string and length of string (a copy of t_msg
is not created). You have to be careful when using asio::buffer
with asynchronous operations because its return type is pair (pointer,length) to string, it doesn't extend the lifetime of string.
async_write
function returns immediately and we don't know when handler will be called, so you have to make sure that msg
is valid until handler is called.
for(;;)
{
std::string buf = *message from queue*//pseudo code
m_appSockets["app0"].get()->write(buf);
// if you want to send original buf string
// before this loop ends all asynchronous operation writing buf must be complete
}
If your goal is to send msg
you have missed to use ref
wrapper, because bind
takes parameters by value by default.
std::bind(&Session::doWrite, shared_from_this(), t_msg) // make copy of t_msg
above creates callback which holds copy of t_msg
.
When this callback is called copy of t_msg
is passed into boost::asio::buffer(t_msg)
in Session::doWrite
. Probably, before callback created by std::bind(&Session::onWrite, shared_from_this(), std::placeholders::_1, std::placeholders::_2)
is executed string copy is destroyed and buffer
points to deleted data.
You can rewrite Session::write
method using std::ref
:
m_socket.get_executor().context().post(std::bind(&Session::doWrite, shared_from_this(), std::ref(t_msg)));
and ensure that all asynchronous operations which write this string are complete until for
loop ends in senderThread
. Or you need to find another way to hold t_msg
string while asynchronous operations are executed.
edited Nov 22 '18 at 10:40
answered Nov 22 '18 at 10:31
rafix07rafix07
8,4731916
8,4731916
Thank you very much for your answer. Indeed this is a problem I have. I adapted my code but this doesn't fix the segmentation fault. The error occurs already in in write() before doWrite() is reached. For example: If I add a member int dummy{5}; to session and try access it through a getter method at the beginning of write() I already get the segmentation fault.
– UltraGeralt
Nov 22 '18 at 10:49
1
Thanks for your answer which would have let to mistakes later on. I accessed the map in a seperate thread before the async accept created the session in the map, as we got the "this" pointing to 0x0 in the core dump. Making sure the object is created first fixed the problem.
– UltraGeralt
Nov 22 '18 at 13:42
add a comment |
Thank you very much for your answer. Indeed this is a problem I have. I adapted my code but this doesn't fix the segmentation fault. The error occurs already in in write() before doWrite() is reached. For example: If I add a member int dummy{5}; to session and try access it through a getter method at the beginning of write() I already get the segmentation fault.
– UltraGeralt
Nov 22 '18 at 10:49
1
Thanks for your answer which would have let to mistakes later on. I accessed the map in a seperate thread before the async accept created the session in the map, as we got the "this" pointing to 0x0 in the core dump. Making sure the object is created first fixed the problem.
– UltraGeralt
Nov 22 '18 at 13:42
Thank you very much for your answer. Indeed this is a problem I have. I adapted my code but this doesn't fix the segmentation fault. The error occurs already in in write() before doWrite() is reached. For example: If I add a member int dummy{5}; to session and try access it through a getter method at the beginning of write() I already get the segmentation fault.
– UltraGeralt
Nov 22 '18 at 10:49
Thank you very much for your answer. Indeed this is a problem I have. I adapted my code but this doesn't fix the segmentation fault. The error occurs already in in write() before doWrite() is reached. For example: If I add a member int dummy{5}; to session and try access it through a getter method at the beginning of write() I already get the segmentation fault.
– UltraGeralt
Nov 22 '18 at 10:49
1
1
Thanks for your answer which would have let to mistakes later on. I accessed the map in a seperate thread before the async accept created the session in the map, as we got the "this" pointing to 0x0 in the core dump. Making sure the object is created first fixed the problem.
– UltraGeralt
Nov 22 '18 at 13:42
Thanks for your answer which would have let to mistakes later on. I accessed the map in a seperate thread before the async accept created the session in the map, as we got the "this" pointing to 0x0 in the core dump. Making sure the object is created first fixed the problem.
– UltraGeralt
Nov 22 '18 at 13:42
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53427997%2fc-boost-asio-segmentation-fault-on-async-write-while-accessing-write-method-th%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown