Android非法内存访问 - 谁和如何处理?

时间:2014-01-09 03:30:36

标签: android memory-management linux-kernel arm page-fault

我正在尝试调试由于无效的内存访问导致应用程序触发连续数据中止的问题。

我有以下问题。

  1. 通常,当Android(CPU ARM)中的应用程序访问无效的内存访问时,会发生什么?

    我猜是会发生页面错误,然后会触发数据中止。是这样吗?有人可以简要解释一下Android如何处理无效的内存访问?

  2. 进行非法内存访问的进程会发生什么变化?它是一次又一次地重新启动还是被杀死了?谁处理这个?
  3. 我想要一些代码的引用(仅在可能的情况下)。谢谢。

1 个答案:

答案 0 :(得分:2)

Android建立在Linux之上。所以你的问题实际上就是Linux如何处理网上应该有很多指针的那些。

通常,当应用程序执行非映射到应用程序的内存地址的非法内存访问时,Linux会向应用程序发送SIGSEGV信号,如果不处理,则会在内核日志中生成一些有用的日志时将其终止({{ 1}},dmesg)。

Android也可以在/ data / tombstone下创建逻辑删除,并在android日志缓冲区(/proc/kmsg)中添加一些额外的详细信息。

通常情况下,当一个进程在Linux中死亡时,Linux对它没有任何特殊处理,但是你可能会有一些更高级别的应用程序生命周期管理,这会做一些额外的步骤。

Android只为正常的应用程序创建一个“意外的应用程序崩溃”对话框,但对于需要保持活动的服务或应用程序(如主屏幕),它会使用一些逻辑重新启动它们,以避免错误服务的连续重生。

不可能在代码库中找到完成所有这些的单点,因为它是在不同的部分,层之间进行逻辑分布。