[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
Re: [Libevent-users] Valgrind, evmap_io_add Invalid write of size 4
On Sun, Jun 15, 2014 at 03:09:59PM +0200, Robin wrote:
> Hey,
>
> I was just debugging some crashes and memory leaks with valgrind and this
> came up:
> [warn] Epoll MOD(4) on fd 61 failed. Old events were 6; read change was 2
> (del); write change was 0 (none): Bad file descriptor
Hi,
I don't see any reason why epoll_ctl() can fail under valgrind only, so
seems that this is *not* false-positive.
You could try to use $(valgrind --db-attach=yes) to investigate this.
> >==10706== Invalid write of size 4
> >==10706== at 0x5348FE6: evmap_io_add (in
> >/usr/lib/i386-linux-gnu/libevent-2.0.so.5.1.7)
> >==10706== by 0x5337BAA: event_add (in
> >/usr/lib/i386-linux-gnu/libevent-2.0.so.5.1.7)
> >==10706== by 0x5343A57: _bufferevent_add_event (in
> >/usr/lib/i386-linux-gnu/libevent-2.0.so.5.1.7)
> >==10706== by 0x53441DC: be_socket_enable (in
> >/usr/lib/i386-linux-gnu/libevent-2.0.so.5.1.7)
> >==10706== by 0x5343475: bufferevent_enable (in
> >/usr/lib/i386-linux-gnu/libevent-2.0.so.5.1.7)
> >==10706== by 0x806974F: net::Socket::Setup(int, sockaddr_in)
> >(Socket.cpp:77)
> >==10706== by 0x8068A96: net::Listener<net::socket::Client>::Accept(int,
> >sockaddr_in*) (Listener.hpp:85)
> >==10706== by 0x806885A:
> >net::Listener<net::socket::Client>::SOnAccept(evconnlistener*, int,
> >sockaddr*, int, void*) (Listener.hpp:112)
> >==10706== by 0x53462E1: listener_read_cb (in
> >/usr/lib/i386-linux-gnu/libevent-2.0.so.5.1.7)
> >==10706== by 0x78BBD23D: ???
> >==10706== Address 0x61d44e80 is 176 bytes inside a block of size 4,056
> >free'd
> >[...] Non libevent related stuff, some free'd memory which has nothing to
> >do with libevent
>
> net::Listener:
> > void Accept(evutil_socket_t fd, sockaddr_in * addr) {
> > sys_log(0, "New connection on %s:%d from %s",
> >m_bind_ip.c_str(), m_bind_port, inet_ntoa(addr->sin_addr));
> > SocketType* s = new SocketType();
> > s->SetID(m_socket_id++);
> > if (!s->Setup(fd, *addr)) {
> > sys_err("Failed to set up socket %d", m_socket_id);
> > delete s;
> > return;
> > }
> > if (!OnAccept(s)) {
> > delete s;
> > return;
> > }
> > m_sockets.insert(std::pair<unsigned int,
> >SocketType*>(s->GetID(), s));
> > }
> > static void SOnAccept(evconnlistener *, evutil_socket_t fd, struct
> >sockaddr * addr, int socklen, void * arg) {
> > if (!arg) {
> > sys_err("Recieved nullpointer as arg");
> > return;
> > }
> > Listener<SocketType>* l = (Listener<SocketType>*) arg;
> > l->Accept(fd, (sockaddr_in*) addr);
> > }
> The callback is registered like this:
> m_listener =
> evconnlistener_new_bind(NetworkManager::instance().GetEventBase(),
> Listener::SOnAccept, this, LEV_OPT_REUSEABLE | LEV_OPT_CLOSE_ON_FREE, 1024,
> (sockaddr*) & sa, sizeof (sa));
Do you have one event-base per thread?
>
> Socket::Setup:
> > bool Socket::Setup(evutil_socket_t fd, sockaddr_in addr) {
> > if (m_event) {
> > sys_err("Socket already set up");
> > return false;
> > }
> > m_addr = addr;
> > m_event =
> >bufferevent_socket_new(NetworkManager::instance().GetEventBase(), fd,
> >_SOCKET_DEFAULT_FLAGS);
> > bufferevent_setcb(m_event, Socket::SOnRead, Socket::SOnWrite,
> >Socket::SOnEvent, this);
> > bufferevent_enable(m_event, EV_READ | EV_WRITE);
> > OnConnect();
> > return true;
> > }
> Is this just a false positive or am I doing something wrong?
> This doesn't happen every time there's a new connection, in fact, it only
> seems to happen once
>
> I am running on Debian Wheezy & libevent 2.0.19
Could you try with the latest libevent version?
(But I don't see any patches that can fix it in history)
>
> I am also getting a bunch of these type errors:
> >[warn] Epoll MOD(4) on fd 68 failed. Old events were 6; read change was 2
> >(del); write change was 0 (none): Bad file descriptor
>
> Usually after it hit a breakpoint or it couldn't keep up (running this in a
> single thread+valgrind, stuff gets sloow)
> Am I right to assume I can just ignore it as it only seems to happen when
> running valgrind?
>
>
> - imer
> ***********************************************************************
> To unsubscribe, send an e-mail to majordomo@xxxxxxxxxxxxx with
> unsubscribe libevent-users in the body.
--
Respectfully
Azat Khuzhin
***********************************************************************
To unsubscribe, send an e-mail to majordomo@xxxxxxxxxxxxx with
unsubscribe libevent-users in the body.