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

网站建设与搜索引擎营销有什么关系高平市网站建设公司

网站建设与搜索引擎营销有什么关系,高平市网站建设公司,制作网站找哪家好,wordpress插件登录公众号1,查看日志信息打印 我们看到日志发现发包的skb模块有NULL pointer情况,我们看代码分析skb指针不可能出现是空指针,这个时候我们怀疑可能是出现了踩内存导致的空指针情况,所以我们首先需要找到系统PANIC的条件,也就是…

1,查看日志信息打印

我们看到日志发现发包的skb模块有NULL pointer情况,我们看代码分析skb指针不可能出现是空指针,这个时候我们怀疑可能是出现了踩内存导致的空指针情况,所以我们首先需要找到系统PANIC的条件,也就是触发空指针(踩内存的条件)。

2,分析问题出现场景

最开始测试说这个问题是必现或者高概率复现的,我们查看日志看着空指针又没看出什么,后面我们自己想复现问题找到问题的触发条件,后面我们发现wifi测速时这个问题出现的概率比较高,但是后面我们加了一些打开符号表和其他的调试信息后发现问题问题出现的概率也不是很高,驱动专家们怀疑这个时候改了逻辑打开了符号表,可能踩到了其他的内存,这个时候我们只能通过测试场景去看问题了。

3,猜测内存踩踏点

最开始出现的场景是wifi测速时出现的,虽然PANIC收集的信息不是很完整,但是我们可以看到是wifi模块的tx_buf发包函数出现了空指针,所以我们先和协议的同事确认了一些测速时一些发包情况和发包函数,我们首先看到了协议栈的发包函数使用的是ndo_start_xmit。

netdev_tx_t ndo_start_xmit(struct sk_buff *skb, struct net_device *dev)
{
    // 停止队列以避免更多数据包进入
    netif_stop_queue(dev);

    // 调用硬件发送接口发送数据包
    if (0 == hardware_send_frame(skb->data, skb->len)) {
        // 更新设备统计信息
        dev->stats.tx_packets++;
        dev->stats.tx_bytes += skb->len;
        dev_kfree_skb(skb); // 释放数据包
        return NETDEV_TX_OK;
    } else {
        // 发送失败,重启队列
        netif_wake_queue(dev);
        return NETDEV_TX_BUSY;
    }
}

 和协议栈的专家确认以及查看协议栈的发包函数的实现以及发包的流程,发现该线程是可重入的,但是没有加锁,所以可能会有问题,所以我们试着把ndo_start_xmit换成有RCU锁保护的dev_queue_xmit 函数,我们来看看函数dev_queue_xmit 的具体实现。

int dev_queue_xmit(struct sk_buff *skb)
{
    struct net_device *dev = skb->dev;
    struct Qdisc *q;
    int rc = -ENOMEM;

    // 使用RCU读取设备的队列规则
    rcu_read_lock();                  // 开启RCU读端临界区
    q = rcu_dereference(dev->qdisc);  // 安全地读取qdisc
    rcu_read_unlock();                // 关闭RCU读端临界区

    // 入队操作和发送流程
    if (q->enqueue) {
        rc = q->enqueue(skb, q);
        if (likely(rc == NET_XMIT_SUCCESS)) {
            __netif_schedule(q);
            rc = NET_XMIT_SUCCESS;
        }
    }

    // 无队列设备直接发送
    if (dev->flags & IFF_LOOPBACK) {
        rc = dev_hard_start_xmit(skb, dev, NULL, NULL);
    }

    return rc;
}

struct sk_buff *dev_hard_start_xmit(struct sk_buff *first, struct net_device *dev,
                                    struct netdev_queue *txq, int *ret) 
{
    struct sk_buff *skb = first;
    int rc = NETDEV_TX_OK;

    while (skb) {
        struct sk_buff *next = skb->next;

        skb->next = NULL;
        rc = xmit_one(skb, dev, txq, next != NULL); // 调用 xmit_one 发送数据包

        if (unlikely(!dev_xmit_complete(rc))) {
            skb->next = next;
            goto out;
        }

        skb = next;
        if (netif_xmit_stopped(txq) && skb) {
            rc = NETDEV_TX_BUSY;
            break;
        }
    }

out:
    *ret = rc;
    return skb;
}

换成上面的函数后测速接近300次没有出现空指针相关的问题了。 

总结:我们使用和封装线程函数时我们需要考虑不同的场景,考虑函数的调用情况,看函数是否可以重入,如果是就需要考虑加入一些锁机制来实现互斥,还有一些共享资源的使用情况也是如此。

http://www.dtcms.com/wzjs/572648.html

相关文章:

  • 企业网站seo最好方法南充房产信息
  • psd做网站切片网页文件模板下载
  • 58同城推广能免费做网站吗建材 东莞网站建设
  • 机关网站建设前期准备工作专业手机网站建设公司
  • 做seo的网站推广网站培训培训班
  • 返利网站方案网页视频下载慢怎么办
  • 网站建设中怎么编辑图片做网站网页文件
  • 网站备案 法人代表wordpress视频广告插件
  • 政企网站建设网站维护费一年多少钱
  • 网站开发怎么接单小程序价格为什么比网站建设高
  • php网站开发实战教程新图闻的品牌建设经验
  • 珠海做网站设计有哪些建可收费的网站
  • 网站上传面板网站申请域名
  • c 做网站 知乎备案时的网站名称
  • 谷德设计网介绍企业网站排名提升软件能优化
  • 杭州酒店网站设计公司推荐苏州市规划建设局网站
  • 我们公司想做个网站一站式网站建设有哪些
  • 七宝做网站公司查 网站接入服务提供者名称
  • 做动态h5的网站运营网站费用
  • 西安 网站建设外包首尔面积
  • 唯美网站建设中国排建设银行悦生活网站
  • 外贸电子商务网站华夏人寿保险公司官网
  • 网站建设的实训报告怎么写做刷单哪个网站找小白
  • 常州地区做网站个人简历html网页模板
  • 网站建设职业情况网站后台登陆不上去
  • 网站建设与设计ppt模板wordpress qq微信登陆地址修改密码
  • 网站建设嗟商文件win7 iis发布网站教程
  • 给别人做网站的销售叫什么苏州注册公司需要什么条件
  • 找做网站技术人员2018企业网站转化率
  • 长沙网站定制做微商去哪个网站推广