UE4 内存写坏导致异常崩溃问题记录

这篇具有很好参考价值的文章主要介绍了UE4 内存写坏导致异常崩溃问题记录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 问题表现

经常出现进程崩溃,崩溃堆栈较为底层


原因基本上都是 read write memory 时触发了异常,盘查后初步怀疑是内存写坏了。

2. 排查期

UE 支持各种内存分配器:

  • TBB
  • Ansi
  • Jemalloc
  • Stomp
    还有自带的内存分配器:
  • Binned
  • Binned2
  • Binned3
    可以参考文章 UE 中的内存分配器。
    其中 Stomp 是引擎提供的排查内存写坏的工具之一,通过增加参数 -stompmalloc 可以让 UE 默认采用该内存分配器,启用了之后崩溃的第一现场就是内存写坏的代码地址。
    通过排查发现崩溃原因是遍历迭代器时删除元素后没有及时 continue,大致示例如下:
for(TArray<Actor*>::TIterator Iter(Actors); Iter; ++ Iter)
{
if (xxx)
{
Iter.RemoveCurrent(); //没有 continue
}

if (xxx)
{
Iter.RemoveCurrent();//没有 continue
}
}

当数组元素只剩一个时,如果触发了两次 RemoveCurrent,就会导致写到数组之外的内存空间,RemoveCurrent 的机制会把后面的数组元素迁移到删除的位置上,保证数据连贯。同时 RemoveCurrent 完毕后会自动把迭代器的下标前移一位。

3. Stomp 原理

3.1 内存覆盖

Stomp 其主要的功能是在写坏内存时可以马上捕获到第一现场。内存写坏了通常指程序在操作内存时写入了非法的数据或超出了内存分配的范围,导致程序出现错误或崩溃。这种情况通常被称为越界访问或非法访问内存。
大部分情况下有内存池的技术,且操作系统分配内存往往会向上按页对其分配,所以一时的内存越界读写有可能不会马上出现问题。而 Stomp 是在内存越界时就对其抛出异常。

3.2 实现原理

开启 Stomp 之后,内存分配基本上由 FMallocStomp::MallocFMallocStomp::Free 接管。

void* FMallocStomp::Malloc(SIZE_T Size, uint32 Alignment)
void FMallocStomp::Free(void* InPtr)

要做到写坏内存后能直接触发异常,需要在内存分配上做手脚,这里主要用到了两点:

  • 操作系统支持的 Pagefault 和 Page 权限控制
  • 哨兵机制
    Stomp 在给用户分配内存的时候会额外分配 2 个 Page 出来,分别在返回给用户的指针地址空间前后。当用户超出分配给他的内存上读写时,就会触发异常。其分配内存的流程大致如下:

这里有个问题是 FAllocationData 只有 32 个字节,但是其分配了一个 Page 给其使用,这里主要是由于分配内存都需要对齐 Page。到此内存分配完毕,接下来有 2 种情况:文章来源地址https://www.toymoban.com/news/detail-420505.html

  1. 从 Page2 写数据一直写到 Page3,由于 Page3 被标记为不可读不可写,因此一旦出现越界,就会直接抛出异常
  2. 从 Page1 写数据一直写到 Page0,由于 Page0 末端分配了一个 FAllocationData,因此一旦越界,哨兵值会被覆盖,当释放内存时FMallocStomp::Free 就会对内存块的 FAllocationData 进行检查,一旦哨兵比对异常就抛出异常

到了这里,关于UE4 内存写坏导致异常崩溃问题记录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 虚幻引擎4崩溃?10个UE4崩溃解决方法来了

    虚幻引擎 4 在PC上运行出现不断崩溃的情况?你绝对不是一个人,成千上万的用户最近报告了同样的问题。但好消息是你可以修复它。以下是已证明对许多玩家有用的解决方案列表。 如何修复虚幻引擎4的崩溃问题,下面这10个解决办法一起来看看吧。 虚幻引擎 的开发者不断

    2024年02月04日
    浏览(54)
  • UE5 UE4 修复GPU驱动程序崩溃

    原贴链接:https://mp.weixin.qq.com/s/e5l9XtfwEFWgwhHi1b2idg UE5 UE4在处理含有大量图形的项目时,你有可能会遇到GPU崩溃 可以通过修改注册表,修复崩溃。 UE5 UE4在处理含有大量图形的项目时,你有可能会遇到GPU崩溃。效果如下: 接着通常会出现虚幻引擎崩溃报告器窗口。 为防止应用

    2024年02月02日
    浏览(50)
  • 内存越界是否一定会导致程序崩溃吗?详解内存越界

    目录   1、什么是内存越界? 1.1、对数组的读越界  1.2、执行strcpy时的写越界 

    2024年02月03日
    浏览(47)
  • 【复盘】记录一次类型不一致导致的Kafka消费异常问题

    业务主要是通过A系统向B系统写入Kafka,然后B系统消费Kafka 将结果写到Kafka中,A进行消费最终结果。 在整个流程中,A写入Kafka会写入一张 record1表记录,然后在A消费最终结果的时候也记录一张record2表。主要改动的话 只是B系统内进行写入数据,但是没有想到用的同一个Map导致

    2024年02月16日
    浏览(37)
  • UE4 导致AIMoveTo不生效的原因

       

    2024年02月10日
    浏览(47)
  • 【生产问题记录】一次简单的 Http 请求异常处理 (请求的 url 太长, Nginx 直接返回 400, 导致请求服务异常)

    按照惯例直接说结论。 后台服务 A 有一个 Http 接口, 代码如下: 没错, 一个 Get 请求, 入参是一个 List 。 同时有另一个后台服务 B, 里面有段逻辑会通过 RestTemplate 调用服务 A 的这个接口, 代码如下: 在服务 B 中, 通过 batchGetUserInfo 方法请求服务 A 时, 传入了一个长度为 122 的 List

    2024年01月16日
    浏览(55)
  • 记录--浏览器渲染15M文本导致崩溃怎么办

    最近,我刚刚完成了一个阅读器的txt文件阅读功能,但在处理大文件时,遇到了文本内容过多导致浏览器崩溃的问题。 一般情况下,没有任何样式渲染时不会出现什么问题,15MB的文件大约会有3秒的空白时间。 尽管目前还没有严重的问题,但随着文件继续增大,肯定会超过浏

    2024年02月13日
    浏览(55)
  • UE4 / UE5 内存与性能优化

    资源压缩 在图片资源上右键选择Size Map可以看到资源所占大小,将右上角切换成Memory Size,所占内存大小,如果发现这个资源所占太大,就可以考虑压缩一下图片大小,看看效果是否满足需求,这个会把引用到的资产所占用内存一同显示出来 粒子优化 很多游戏里面,粒子优化

    2024年02月04日
    浏览(53)
  • 记录一个iOS UITableView 正在刷新的时候修改数据源导致的崩溃

    首先看一下崩溃堆栈信息 由于tableview 调用layoutsubViews 执行到代理方法 -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ 由于是崩溃在系统方法里面的,我们无法直接看到是因为调用哪个方法导致的崩溃 后来经过多次调试,发现是因为调用了reloadData 出

    2024年01月17日
    浏览(56)
  • Linux--野指针导致的进程崩溃问题

    运行结果:  

    2024年02月14日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包