【问题标题】:ev_loop() causing valgrind error - address is just below the stack ptrev_loop() 导致 valgrind 错误 - 地址就在堆栈 ptr 下方
【发布时间】:2013-11-05 15:55:51
【问题描述】:

我正在做一个在 C 中实现 IRC 守护进程的项目。这仍处于非常早期的开发阶段,它现在所做的只是在主进程上接受新连接,并且对于每个新连接,它创建一个线程。来自任何客户端的每条消息都会广播到所有其他连接的客户端。

我正在使用 libev 的回调机制,以便线程不会在套接字读取时阻塞。每个线程都使用自己独立的事件循环。这是我的main() 函数的一部分:

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

    int portno = 6667;

    /* Libev stuff */
    struct ev_loop *loop = EV_DEFAULT;
    struct ev_io socket_watcher;

    /* Here, I create a socket called mainsock_fd, and then call bind() and listen() 
        ...
    */

    /* At this point, we're ready to accept new clients. Set the callback function for new connections */
    ev_io_init(&socket_watcher, connection_cb, mainsock_fd, EV_READ);
    ev_io_start(loop, &socket_watcher);

    /* This is where the problem lies */
    ev_loop(loop, 0);

    /* ... */

    return 0;
}

我不是 libev 专家。我一直在阅读 libev 的文档和示例程序。此代码完全按预期工作,但是当我通过 valgrind 运行它时,出现此错误:

==20984== Command: ./yaircd
==20984== 
==20984== Invalid read of size 1
==20984==    at 0x40638D1: ev_run (in /usr/lib/libev.so.4.0.0)
==20984==    by 0x804923F: ev_loop (ev.h:820)
==20984==    by 0x8049410: main (yaircd.c:71)
==20984==  Address 0xbedf52df is just below the stack ptr.  To suppress, use: --workaround-gcc296-bugs=yes

第 71 行是这条指令:

ev_loop(loop, 0);

在我启动程序后立即出现错误,没有连接客户端。只是我调用ev_loop 的事实导致了这个错误。

我不知道如何解决它。到目前为止,我编写的代码将成为 IRC 服务器的核心,我想绝对确定不存在任何错误。我想要一个干净的 valgrind 输出。

有什么建议吗?

更新:我编译并执行了他们的示例程序 (http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod#EXAMPLE_PROGRAM),valgrind 报告了同样的错误。我猜这是libev 中的一些错误,或者该示例未正确编码。我还阅读了他们关于 valgrind 的部分 - http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod#VALGRIND - 但没有发现任何特别之处。我想我会试试他们的邮件列表。

【问题讨论】:

    标签: c multithreading sockets libev


    【解决方案1】:

    之前libev的邮件列表中已经提交过类似问题(见http://lists.schmorp.de/pipermail/libev/2013q2/002172.html)。

    根据开发人员的说法,这是valgrind中的一个无害的错误,正如回复中指出的那样:http://lists.schmorp.de/pipermail/libev/2013q2/002173.html

    不,这只是 valgrind 中的一个(无害的)错误,显然 无法正确识别锁定前缀或类似情况。

    不影响valgrind内外的正确性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-24
      • 2015-01-12
      • 2023-03-20
      • 2015-04-11
      • 2011-02-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多