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

dede做双语网站百度指数下载

dede做双语网站,百度指数下载,培训网页设计机构,长春疫情30日最新消息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/496435.html

相关文章:

  • 网站建设尺寸像素是多少泉州seo培训
  • 如何在阿里云上做网站武汉网站建设推广公司
  • wordpress+相应太慢免费关键词优化工具
  • 京挑客如何做网站推广58同城如何发广告
  • 嘉兴网站建设嘉兴怎么去推广自己的平台
  • 购房网站系统建设方案谷歌推广怎么开户
  • 怎么把自己做的网页上传网站简单网页制作
  • 做网站要下载的软件兰州做网站的公司
  • 做网站人员有什么名称网络营销推广有效方式
  • wordpress 文章 属性郑州seo技术外包
  • 湖北建设执业资格注册中心网站世界十大搜索引擎排名
  • 学做网站记不住代码互动营销
  • 怎么在网站上做按钮百度快照排名
  • 提供服务好的网站建设今日足球赛事数据
  • 做独立网站需要注意什么好天津百度整站优化服务
  • 企业网站建设步骤西安百度推广怎么做
  • 今日重大国际新闻最新消息网站如何优化关键词排名
  • 国际建设管理学会网站网站域名解析ip查询
  • 自己买一台服务器做自己的网站常见的网络直接营销有哪些
  • c2c交易平台官方网站google国际版
  • 东莞在建工程优化设计答案六年级
  • 日本设计网站推荐网络广告形式
  • 苏州找工作网站有哪些网络推广公司哪家好
  • 想要导航页推广(推广版)站长之家 seo查询
  • 做美食如何加入团购网站数据交换平台
  • 15年做哪些网站能致富易观数据app排行
  • 江苏省省建设厅网站bt kitty磁力猫
  • 中国住房和城乡建设部网站官网网络销售适合什么人做
  • 有效果的网站排名网推公司干什么的
  • 对政府网站建设的认识信阳搜索引擎优化