【问题标题】:Native crash programmatically以编程方式发生本机崩溃
【发布时间】:2015-07-01 17:47:08
【问题描述】:

为了测试原生崩溃报告,是否有一种简单的方法可以让应用程序因原生崩溃而崩溃?

请注意,我正在寻找适用于所有设备的通用解决方案,而不是特定于设备的解决方案。想过用Unsafe类(把非法地址写入卡住),但是貌似不支持

【问题讨论】:

  • 在原生 SO 中写入 *(int*)0 = 0;
  • 我可以从 java 做点什么吗?
  • 有一个关于 SO 的问题。据我记得,他们找不到好方法。利用已知的 Android 漏洞可能会让您有所收获,但这几乎与设备无关。

标签: android android-ndk dalvik


【解决方案1】:

如果您想导致 Java 代码崩溃,请使用 dalvik.system.VMDebug.crash()。这不是公共 API 的一部分,因此您需要通过反射来访问它。这对达尔维克有用;我不知道它是否仍然适用于 Art。

支持某些sun.misc.Unsafe 方法,因此您可以通过在putIntVolatile() 等调用中为offset 选择适当的值来导致崩溃。如果偏移量是对象指针的否定,您将取消引用地址零并崩溃。

最可靠的方法是使用 NDK 创建一个简单的原生库。我个人倾向于将值存储在“命名”地址中,例如 0xdeadd00d,因为它们让您知道这是您的代码故意崩溃,但空指针 derefs 也可以。

【讨论】:

  • 现代版 AOSP 中不再存在这种方法。
【解决方案2】:

正如@fadden 指出dalvik.system.VMDebug.crash() 的使用,这里有一个通过反射访问它的辅助方法。

public void crashNatively() {
    try {
        Class.forName("dalvik.system.VMDebug")
                .getMethod("crash")
                .invoke(null);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

【讨论】:

  • 现代版 AOSP 中不再存在这种方法。
猜你喜欢
  • 2012-04-10
  • 1970-01-01
  • 1970-01-01
  • 2018-09-17
  • 2011-08-22
  • 2023-03-17
  • 2012-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多