【问题标题】:Android illegal memory access - who and how is it handled?Android非法内存访问 - 谁以及如何处理?
【发布时间】:2014-01-27 11:13:21
【问题描述】:
我正在尝试调试应用程序由于无效的内存访问而触发连续数据中止的问题。
我有以下疑问。
-
一般来说,当Android(CPU ARM)中的应用程序正在访问无效的内存访问时,会发生什么?
我猜会发生页面错误,然后会触发数据中止。是这样吗?有人能简单解释一下Android是如何处理无效内存访问的吗?
-
进行非法内存访问的进程会发生什么?它是一次又一次地重新启动还是被杀死?谁来处理这个?
我想要一些对代码的引用(仅在可能的情况下)。谢谢。
【问题讨论】:
标签:
android
memory-management
linux-kernel
arm
page-fault
【解决方案1】:
Android 建立在 Linux 之上。所以你的问题实际上是 Linux 如何处理那些在网络上应该有很多指针的问题。
一般来说,当应用程序进行非法内存访问,即内存地址未映射到您的应用程序时,Linux 将向应用程序发送 SIGSEGV 信号,如果未处理,则会在内核日志中生成一些有用的日志时杀死它(@987654321 @, /proc/kmsg)。
Android 还可能在 /data/tombstone 下创建墓碑,并将一些额外的详细信息放入 android 日志缓冲区 (adb logcat)。
通常当一个进程在 Linux 中死掉时,Linux 不会对此做任何特别的事情,但是您可能会有一些更高级别的应用程序生命周期管理来执行一些额外的步骤。
Android 只是为普通应用程序创建一个~“意外应用程序崩溃”对话框,但对于需要保持活动状态的服务或应用程序(如主屏幕),它会通过一些逻辑重新启动它们,以避免错误服务的持续重生。
不可能在代码库中找到执行所有这些操作的单点,因为它是在不同部分、层之间展开的逻辑。