以编程方式本机崩溃
Native crash programmatically
有没有一种简单的方法可以让应用程序崩溃并发生本机崩溃,以便测试本机崩溃报告?
请注意,我正在寻找适用于所有设备的通用解决方案,而不是特定于设备的解决方案。想过用Unsafeclass(把非法地址写入卡住),但是貌似不支持
如果要从 Java 代码导致崩溃,请使用 dalvik.system.VMDebug.crash()
。这不是 public API 的一部分,因此您需要通过反射来访问它。这对 Dalvik 有效;我不知道它是否仍然适用于艺术。
某些 sun.misc.Unsafe
方法受支持,因此您可以通过在 putIntVolatile()
等调用中为 offset
选择适当的值来导致崩溃。如果偏移量是对象指针的否定,您将取消引用地址零并崩溃。
最可靠的方法是使用 NDK 创建一个简单的本机库。我个人喜欢将值存储在 "named" 地址中,例如 0xdeadd00d
,因为它们让您知道这是您的代码故意崩溃,但空指针 derefs 也有效。
正如@fadden 指出的 dalvik.system.VMDebug.crash()
的使用,这里有一个通过反射访问它的辅助方法。
public void crashNatively() {
try {
Class.forName("dalvik.system.VMDebug")
.getMethod("crash")
.invoke(null);
} catch (Exception e) {
e.printStackTrace();
}
}
有没有一种简单的方法可以让应用程序崩溃并发生本机崩溃,以便测试本机崩溃报告?
请注意,我正在寻找适用于所有设备的通用解决方案,而不是特定于设备的解决方案。想过用Unsafeclass(把非法地址写入卡住),但是貌似不支持
如果要从 Java 代码导致崩溃,请使用 dalvik.system.VMDebug.crash()
。这不是 public API 的一部分,因此您需要通过反射来访问它。这对 Dalvik 有效;我不知道它是否仍然适用于艺术。
某些 sun.misc.Unsafe
方法受支持,因此您可以通过在 putIntVolatile()
等调用中为 offset
选择适当的值来导致崩溃。如果偏移量是对象指针的否定,您将取消引用地址零并崩溃。
最可靠的方法是使用 NDK 创建一个简单的本机库。我个人喜欢将值存储在 "named" 地址中,例如 0xdeadd00d
,因为它们让您知道这是您的代码故意崩溃,但空指针 derefs 也有效。
正如@fadden 指出的 dalvik.system.VMDebug.crash()
的使用,这里有一个通过反射访问它的辅助方法。
public void crashNatively() {
try {
Class.forName("dalvik.system.VMDebug")
.getMethod("crash")
.invoke(null);
} catch (Exception e) {
e.printStackTrace();
}
}