muduo异步日志——core dump后查找还未来得及写出的日志

目录

前言

生成core文件

gdb调试Core文件


前言

       通过异步日志的实现可以知道,日志消息并不是生成后立刻就会写出,而是先存放在前端缓冲区currentBuffer或者前端缓冲区队列buffers中,每过一段时间才会将缓冲区中的日志消息写到日志文件中。那么这就会有问题了:如果程序在中途core dump了,那么在缓冲区中还未来得及写出的日志消息该如何找回呢?

        core dump的原因有多种,现在来构造这样的场景:主线程开启日志线程,写入100万条日志,那么会调用100万次append函数,在前端调用第50000次append函数的时候,让程序执行abort(),如下所示:

int cnt = 0;
void AsyncLogging::append(const char* logline, int len)
{
    if(cnt++ == 50000)abort();
    muduo::MutexLockGuard lock(mutex_);
    if (currentBuffer_->avail() > len)
    ...
}

muduo::AsyncLogging* g_asyncLog = NULL;

void asyncOutput(const char* msg, int len)
{
  g_asyncLog->append(msg, len);
}

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

  muduo::AsyncLogging log("test", 10000000);
  log.start();   //开启日志线程
  g_asyncLog = &log;
  int msgcnt = 0;
  muduo::Logger::setOutput(asyncOutput);//设置日志输出函数

  for(int i=0;i<1000000;i++)  //写入100万条日志消息
      LOG_INFO << "Hello 0123456789" << " abcdefghijklmnopqrstuvwxyz "
               << ++msgcnt;
}

        这样一来,当程序调用了50000次append函数,就会自动abort,也就引发了core dump。

        下面就来看看,如何在这种情况下,去找回还未来得及写出到日志文件中的日志消息。

生成core文件

       要寻找还未写出的日志消息,需要用到core dump时生成的core文件,但是在默认情况下是不生成的,因此需要先开启

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值