我正在做一个在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服务器的核心,我想绝对肯定没有bug存在。我想有一个干净的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-但没发现什么特别的我想我会试试他们的邮件列表。 最佳答案
以前在libev
的邮件列表中提交过类似的问题(请参见http://lists.schmorp.de/pipermail/libev/2013q2/002172.html)。
根据开发人员的说法,这是一个无害的bug invalgrind
,正如本回复中指出的:http://lists.schmorp.de/pipermail/libev/2013q2/002173.html
不,这只是瓦尔格林的一个(无害的)虫子,很明显
无法正确识别锁前缀,或其他。
它不会影响valgrind内外的正确性。