当前位置: 首页 > news >正文

问题排查|记录一次基于mymuduo库开发的服务器错误排查(段错误--Segmentation fault (core dumped))

问题记录:
在刚完成mymuduo库之后,写了一个简单的测试服务器,
但是在服务器运行后直接报错:

cherry@hcss-ecs-4995:~/mymuduo/example$ ./testserver
Segmentation fault (core dumped)

出现多错误这通常意味着程序试图访问其内存空间中未分配(或不允许)的部分。

所以我决定先使用gdb进行一下简单的调试:

gdb ./testserver

把程序跑起来之后马上定位到了报错位置:

Program received signal SIGSEGV, Segmentation fault.
EventLoop::updateChannel (this=0x7fffffffdd60, channel=0x555555572eb0) at /home/cherry/mymuduo/EventLoop.cc:126
126         poller_->updateChannel(channel);

我再查看代码:

125 void EventLoop::updateChannel(Channel *channel) {
126 	poller_->updateChannel(channel);
127 }

既然是段错误,说明我们访问了不被允许访问的内存,或者操作了不被允许操作的内存
接下来我们有以下三个主要的思路:

(gdb) print poller_ #poller是否是空
(gdb) print channel #channel是否为空
(gdb) print *channel #如果channel不是空,那么它是否指向了有效对象,该对象状态是否正常?
(gdb) backtrace #如果都正常,查看调用栈,是哪里调用了 EventLoop::updateChannel 方法

但是比较悲剧的是,我直接 print poller_ 就发现我们重要的poller对象竟然是空!

所以我马上去看了一下构造函数代码是否正常

EventLoop::EventLoop(): looping_(false), quit_(false), callingPendingFunctors_(false), threadId_(CurrentThread::tid()), poller_(Poller::newDefaultPoller(this)), wakeupFd_(createEventfd()), wakeupChannel_(new Channel(this, wakeupFd_)) 

在构造函数中, poller_的初始化是通过newDefaultPoller来完成的,那么去看看它是否正常工作:

Poller* Poller::newDefaultPoller(EventLoop *loop) {if (::getenv("MUDUO_USE_POLL")) {return nullptr; // 生成poll的实例} else {return nullptr; // 生成epoll的实例}
}

好巧不巧,我们竟然在生成epoll实例的地方返回了一个空!之前在写这个代码的时候还没有完成EpollPoller.h文件的书写,为了防止部分编译报错所以先写成空了。

更改代码如下:

#include "EpollPoller.h"
return new EPollPoller(loop);

相关文章:

  • 虚拟现实环境下的远程教育和智能评估系统(一)
  • 头歌数据结构与算法课程设计中-硬币找零
  • vue项目中markdown显示为html
  • MatLab命令行常用命令记录
  • 华为昇腾310 ATC模型转换、CPP推理案例使用
  • finetuning大模型准备(基于Mac环境)
  • SpringBoot 基于jedis实现Codis高可用访问
  • MySQL 命令总结篇-思维导图
  • 关于linux查询free内存消耗命令
  • Vue3实战笔记(55)—Vue3.4新特性揭秘:defineModel重塑v-model,拥抱高效双向数据流!
  • 【计算Nei遗传距离】
  • 东莞酷得智能 组装机械狗电子玩具方案
  • java多态——向下转型
  • Spring boot 随笔 1 DatasourceInitializer
  • 【2024新版】银系统源码/超市收银系统/智慧新零售/ERP进销存管理/线上商城/商户助手
  • “大数据应用场景”之隔壁老王(连载四)
  • 【5+】跨webview多页面 触发事件(二)
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • Java 网络编程(2):UDP 的使用
  • Less 日常用法
  • RxJS: 简单入门
  • SpringCloud集成分布式事务LCN (一)
  • underscore源码剖析之整体架构
  • 回顾2016
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 如何使用 JavaScript 解析 URL
  • 入手阿里云新服务器的部署NODE
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 我的zsh配置, 2019最新方案
  • 消息队列系列二(IOT中消息队列的应用)
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • 函数计算新功能-----支持C#函数
  • 正则表达式-基础知识Review
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (十六)Flask之蓝图
  • (一)基于IDEA的JAVA基础12
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • (转)项目管理杂谈-我所期望的新人
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • ***监测系统的构建(chkrootkit )
  • .describe() python_Python-Win32com-Excel
  • .net framework profiles /.net framework 配置
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .php文件都打不开,打不开php文件怎么办
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • /*在DataTable中更新、删除数据*/
  • @AliasFor 使用