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

网站可以微信支付是怎么做的发布广告的平台免费

网站可以微信支付是怎么做的,发布广告的平台免费,网站代码 如何做层级关系,wordpress做论坛插件如何在apache Arrow定位与解决问题 最近在执行sql时做了一些batch变更,出现了一个 crash问题,底层使用了apache arrow来实现。本节将会从0开始讲解如何调试STL源码crash问题,在这篇文章中以实际工作中resize导致crash为例,引出如何…

如何在apache Arrow定位与解决问题

最近在执行sql时做了一些batch变更,出现了一个 crash问题,底层使用了apache arrow来实现。本节将会从0开始讲解如何调试STL源码crash问题,在这篇文章中以实际工作中resize导致crash为例,引出如何进行系统性分析,希望可以帮助大家~

在最后给社区提了一个pr,感兴趣可以去查阅。

https://github.com/apache/arrow/pull/40817

背景

最近想修改一下arrow batch的大小,当调整为65536后发现crash,出现:

terminate called after throwing an instance of 'std::length_error'what():  vector::_M_default_append

然后通过捕获异常gdb找到异常位置,最后拿到堆栈,发现位置是在join里面构建哈希表侧的partition数组出了问题:

prtn_state.key_ids.resize(num_rows_before + num_rows_new);

即问题转化为:resize操作为何引发throw?

研究了一下STL代码发现,会遇到两种场景,先把STL代码精简一下贴出来给大家看看:

if (__navail < __n) {const size_type __len =_M_check_len(__n, "vector::_M_default_append");}size_type _M_check_len(size_type __n, const char* __s) const {if (max_size() - size() < __n)__throw_length_error(__N(__s));
}

其中最核心的就是_M_check_len函数,看到这个判断能想起哪两种场景呢?

  • 场景1:内存确实不足了,超过了vector的max_size,此时会抛这个异常。

  • 场景2:__n传递的是一个负数,由于是size_t类型,则会变为超大值,从而抛出异常。

场景1在我们系统当中通过查看内存不会遇到,于是转到场景2,首先是猜测是个负数,然后搞了个log包,上去测试发现确实是这个问题,可以看到rows_new变为负数了。

part id 15, dop_ = 105,prtnid + 1 ranges = 0,prtnid ranges = 61434, part size:0, rows_new: -61434, cap: 0

既然这里知道原因了,那么下一步就得继续分析为何会产生负数?

num_rows_new是有分区的range决定的,下面有个公式计算产生了负数

int num_rows_new =locals.batch_prtn_ranges[prtn_id + 1] - locals.batch_prtn_ranges[prtn_id];

继续跟进找到PartitionSort的Eval,里面有几处非常需要注意:

ARROW_DCHECK(num_rows > 0 && num_rows <= (1 << 15));

首先第一个是这个断言,我明明传递的是65536,明显大于这里的32768,为何没有断言成功?事后发现这里是release包,只会报warning,不会fatal。

随后继续往下看,看到了一个比较明显的类型uint16_t,这个玩意就是在计算sum,而要让num_rows_new为负数,只有两种可能:

  • 场景1: locals.batch_prtn_ranges[prtn_id + 1] < locals.batch_prtn_ranges[prtn_id]

  • 场景2:  locals.batch_prtn_ranges[prtn_id + 1] 是负数且locals.batch_prtn_ranges[prtn_id]是负数或者locals.batch_prtn_ranges[prtn_id + 1] 是负数且locals.batch_prtn_ranges[prtn_id]也是负数并且大于前者。

uint16_t sum = 0;
for (int i = 0; i < num_prtns; ++i) {uint16_t sum_next = sum + prtn_ranges[i + 1];prtn_ranges[i + 1] = sum;sum = sum_next;
}

看了这段代码可以知道,场景1排除了,因为是自增的,最差情况是相等,那么就只能场景2,变为负数就不用说了,又碰到了溢出问题,所以可以推测uint16_t溢出了,这个值我们知道是65535,而65536刚好超过它,所以有问题!

至此,这一轮的debug调试与分析到此结束~


往期干货:

热度更新,手把手实现工业级线程池

快速拿下面试算法

49615ca9a56cb2fa9d157574f174575a.jpeg

af5ee136df9e4b4a20f1c236c214662a.jpeg

http://www.hengruixuexiao.com/news/9304.html

相关文章:

  • 禅城网站建设价格百度指数里的资讯指数是什么
  • 做网站日志步骤上海专业排名优化公司
  • seo网站推广排名广州宣布5条优化措施
  • 微商城 微网站制作十大免费网站推广
  • 婚纱摄影的网站模板友情链接推广平台
  • 郑州市多商家网站制作公司网络营销成功案例有哪些2022
  • 银川 网站建设一句话让客户主动找你
  • 网站开发做原型吗12月10日新闻
  • 三d全景网站建设磁力蜘蛛
  • 武汉建设管理局网门户网站媒体软文推广平台
  • 做网站建设需要会哪些网络营销推广方法
  • 桐乡市建设局官方网站优化关键词排名工具
  • 厦门网站建设找哪家比较好搜狗首页排名优化
  • 乡林建设集团官方网站淘宝优化关键词的步骤
  • 中国站长站游戏推广公司靠谱吗
  • 查看网站服务器版本seo优化工作怎么样
  • 网络推广公司利润如何淘宝关键词排名优化
  • 国内网站主机长沙seo培训
  • 免费商用的网站模板友情链接交换系统
  • 怎么把网站和域名绑定百度站长工具排名
  • 符合网络营销的网站2022磁力链接搜索引擎推荐
  • 皖icp合肥网站建设黑客入侵网课
  • 建设通属于官方网站如何创建网址
  • 广州手机网站建设哪家好搜狗搜索引擎优化
  • 网站空间什么意思关键词seo排名优化
  • 做钢化膜网站怎么安装百度
  • 攀枝花网站建设公司外贸接单平台网站
  • 网站弄论坛形式怎么做牛奶软文广告营销
  • 网站建设+荆州十大看免费行情的软件下载
  • 网站空间名怎么制作属于自己的网址