evpp icon indicating copy to clipboard operation
evpp copied to clipboard

evpp 一个诡吊的BUG,能力有限,找不出原因来

Open redfox1999 opened this issue 6 years ago • 0 comments

先说下环境。只有一台linux的虚拟主机(XUbuntu 18.04, g++ 7.3)出现,而且是必现。而且另一台 Ubuntu 和 windows不会出现。

int main(int argc, char const *argv[])
{
    std::cout << "This is test" << std::endl;
    EventLoop* loop = new EventLoop();

    loop->RunAfter(Duration(1.0), [&loop]() {
        std::cout << "callback time ...." << std::endl;
        loop->Stop();
    });

    loop->Run();
    std::cout << "exit...." << std::endl;    
    delete loop;
    std::cout << "END." << std::endl;
    return 0;
}

然后输出:崩溃了。

This is test
callback time ....
double free or corruption (out)
已放弃 (核心已转储)

查了 InvokerTimer 的代码

void InvokeTimer::OnTimerTriggered() {
    DLOG_TRACE << "loop=" << loop_ << " use_count=" << self_.use_count();
    functor_();

    if (periodic_) {
        timer_->AsyncWait();
    } else {
        functor_ = Functor();
        cancel_callback_ = Functor();
        timer_.reset();
        self_.reset();
    }
}

把 timer_.reset() 去掉,程序就正常 了。但觉得奇怪。这里没有多重释放。而且去掉以后,timer就没有释放了。

然后我又再做了另一个测试


void callback(EventLoop* loop) {
    std::cout << "callback time ...." << std::endl;

    loop->Stop();
}


int main(int argc, char const *argv[])
{
    std::cout << "This is test" << std::endl;

    EventLoop* loop = new EventLoop();

    TimerEventWatcher timer(loop, std::bind(callback, loop), Duration(1.0));
    timer.Init();
    timer.AsyncWait();

    loop->Run();

    std::cout << "exit...." << std::endl;    

    delete loop;

    std::cout << "END." << std::endl;

    return 0;
}

不用 RunAfter .直接用 TimerEventWatcher. 然后时间到了以后,loop->Stop() 退出。 运行以后,依然崩溃。也是说 double free 。

This is test
callback time ....
double free or corruption (out)
已放弃 (核心已转储)

试了无数次,然后把程序改成用 RunEvery 不用RunAfter


int main(int argc, char const *argv[])
{
    std::cout << "This is test" << std::endl;

    EventLoop* loop = new EventLoop();

    loop->RunEvery(Duration(1.0), [&loop]() {
        std::cout << "callback time ...." << std::endl;
        loop->Stop();
    });

    loop->Run();

    std::cout << "exit...." << std::endl;    

    delete loop;

    std::cout << "END." << std::endl;

    return 0;
}

神奇的正常了。。。。。 感觉BUG很奇怪。能力有限,解释不不了。 各位大侠有什么看法。

redfox1999 avatar Nov 05 '18 07:11 redfox1999