问题排查|记录一次基于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);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/19770.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决Mybatisplus中没有Db类静态工具的方案--提高版本

方案&#xff1a;将两个的版本都提高即可解决 Mybatis—plus的依赖文件 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3</version></dependency><!-- ge…

Linux module参数传递

一、Linux Module参数传递 在C 语言中&#xff0c;可以在main函数利用argc、argv获取用户的输入&#xff0c;Linux驱动同样可以传递参数&#xff0c;下面简要介绍参数宏的使用方法 利用下面宏定义的参数可以在下面路径找到 /sys/module/xxxxx/parameters/ 1、module_param() …

STM32自己从零开始实操03:输出部分原理图

一、继电器电路 1.1指路 延续使用 JZC-33F-012-ZS3 继电器&#xff0c;设计出以小电流撬动大电流的继电器电路。 &#xff08;提示&#xff09;电路需要包含&#xff1a;三极管开关电路、续流二极管、滤波电容、指示灯、输出部分。 1.2数据手册重要信息提炼 联系排列&…

手写HTML字符串解析成对应的 AST语法树

先看效果 展示如下&#xff1a; HTML模版 转成ast语法树后 在学习之前&#xff0c;我们需要了解这么一个问题&#xff0c;为什么要将HTML字符串解析成对应的 AST语法树。 为什么&#xff1f; 语法分析&#xff1a;HTML字符串是一种标记语言&#xff0c;其中包含了大量的标签…

使用PNP管控制MCU是否需要复位

这两台用到一款芯片带电池&#xff0c;希望电池还有电芯片在工作的时候插入电源不要给芯片复位&#xff0c;当电池没电&#xff0c;芯片不在工作的时候&#xff0c;插入电源给芯片复位所以使用一个PNP三极管&#xff0c;通过芯片IO控制是否打开复位&#xff0c;当芯片正常工作的…

python移动文件

测试1(直接把B文件夹移动到了A里&#xff0c;成为了A的子文件夹) import os import shutil# 移动文件夹,B文件夹在当前目录没有了&#xff0c;跑到了A的子文件里 ## shutil.move(./example1/B/, ./example1/A/)测试2(B文件不动&#xff0c;将B文件里的所有的子文件夹移动到A内…

响应式UI组件DevExtreme中文教程 - 工具栏的自适应模式

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合&#xff0c;使您可以利用现代Web开发堆栈&#xff08;包括React&#xff0c;Angular&#xff0c;ASP.NET Core&#xff0c;jQuery&#xff0c;Knockout等&#xff09;构建交互式的Web应用程序。从Angular和Reac&#xff0c…

Android高通 12/13 录屏流程代码位置

需求如下图 实现系统录屏功能 frameworks/base/packages/SystemUI/src/com/android/systemui/screenrecord 涉及代码 ScreenRecordDialog # startBtn RecordingService # startRecording# stopRecording ScreenMediaRecorder # start # end #save 1、点击开始录屏framewo…

金融科技发展报告:移动支付的市场格局与趋势

引言 随着科技的飞速发展,金融科技已成为推动全球经济发展的重要力量。移动支付作为金融科技的重要分支,其市场格局与趋势日益受到业界的关注。本文将深入剖析移动支付的市场格局,探讨其发展趋势,并辅以相关案例作为辅助。 一、移动支付市场格局 1、全球市场概览 移动支…

python-pytorch编写transformer模型实现翻译0.5.00-写模型

前言 在网上看了一篇文章,借用了文章的大部分代码,并对代码的预测进行修改使得可以正确的预测了,具体链接找了半天找不到 代码 import numpy as np # 导入 numpy 库 import torch # 导入 torch 库 import torch.nn as nn # 导入 torch.nn 库 d_k = 64 # K(=Q) 维度 d_v =…

vscode怎么点击路径直接跳转对应文件

在vue项目中经常要引入工具类、组件、模版等&#xff0c;想要直接去看对应文件&#xff0c;只能自己找到对应路径再去打开。 我们可用在js项目中创建一个 jsconfig.json文件&#xff0c;TS项目可以创建tsconfig.json 文件代码 {"compilerOptions": {"baseUrl&…

52-QSplitter类QDockWidget类

一 QSplitter类 Qt提供QSplitter(QSplitter)类来进行分裂布局&#xff0c;QSplitter派生于QFrame。 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>class MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent nullptr);~…

linux /www/server/cron内log文件占用空间过大,/www/server/cron是什么内容,/www/server/cron是否可以删除

linux服务器长期使用宝塔自带计划任务&#xff0c;计划任务执行记录占用服务器空间过大&#xff0c;导致服务器根目录爆满&#xff0c;需要长期排查并删除 /www/server/cron 占用空间过大问题处理 /www/server/cron是什么内容&#xff1f;/www/server/cron是否可以删除&#xf…

vue2 bug 小白求助!!!(未解决,大概是浏览器缓存的问题或者是路由的问题)

我的vue2项目出现了一个超级恶心的bug 具体流程&#xff1a; 页面a点击a标签->到页面b->页面b用户退出刷新页面->点击浏览器的返回按钮返回上一页 返回页面后页面没有刷新导致用户名还显示这 项目中没有用keep-alive缓存 也在设置了key 尝试了window.removeEventLi…

GDI双缓冲技术绘图

C#双缓冲绘图技术&#xff1a;提升图形性能与用户体验 目录&#xff1a; 引言C#中的绘图技术 单缓冲绘图双缓冲绘图 双缓冲绘图的优势实现双缓冲绘图的步骤示例代码 创建双缓冲窗体在双缓冲窗体上绘制图形 总结 正文&#xff1a; 引言 在计算机图形编程中&#xff0c;绘图技…

vue UI组件整理

Vue2Vue3Element - The worlds most popular Vue UI frameworkOverview 组件总览 | Element Plushttps://v2.iviewui.com/docs/guide/installhttps://www.iviewui.com/view-ui-plus/guide/introduce按钮 Button - Ant Design按钮 Button - Ant DesignVuetify — A Material Des…

考试题库:华为HCIA-Datacom易错题⑪(含答案解析)

华为认证HCIA-Datacom易错题举例和答案分析。 需要更多题库资料&#xff0c;可以在文末领取 1、运行STP协议的设备端口处于Forwarding状态&#xff0c;下列说法正确的有? A.该端口端口既转发用户流量也处理BPDU报文 B.该端口会根据收到的用户流量构建MAC地址表&#xf…

算法每日一题(python,2024.05.24) day.6

题目来源&#xff08;力扣. - 力扣&#xff08;LeetCode&#xff09;&#xff0c;简单&#xff09; 解题思路&#xff1a; 排序&#xff0b;双指针 先将两个数组进行排序&#xff0c;cursor1和cursor分别指向两个数组的首位&#xff0c;比较两个指针所指的值的大小&#xff0…

swiftUI使用VideoPlayer和AVPlayer播放视频

使用VideoPlayer包播放视频&#xff1a;https://github.com/wxxsw/VideoPlayer 提供一些可供测试的视频链接&#xff0c;不保证稳定可用哦&#xff1a; https://vfx.mtime.cn/Video/2019/06/15/mp4/190615103827358781.mp4https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp…

Flutter 中的 SliverFillRemaining 小部件:全面指南

Flutter 中的 SliverFillRemaining 小部件&#xff1a;全面指南 Flutter 是一个由 Google 开发的跨平台 UI 框架&#xff0c;它允许开发者使用 Dart 语言来构建高性能、美观的移动、Web 和桌面应用。在 Flutter 的丰富组件库中&#xff0c;SliverFillRemaining 是一个用于 Cus…