我有一个TabActivity
主机5倍FragmentActivity
.其中一些包含按钮或列表,在其中onClick()
或onItemClick()
创建和推送新片段.
在大多数情况下,这工作正常,但如果事情有点反应迟钝,或者测试人员做了一些愚蠢的事情(按住按钮或列表项,使用不同的手指切换标签,然后释放按钮/列表 - 100%可重复),我在活动暂停并保存后很快得到点击事件.请参阅日志片段:
10-30 17:05:16.258 3415 3415 D BKC DEBUG: More.onSaveInstanceState()
10-30 17:05:16.258 3415 3415 D BKC DEBUG: MoreFragment.onPause()
10-30 17:05:17.309 3415 3415 D BKC DEBUG: MoreFragment.onItemClick()
Run Code Online (Sandbox Code Playgroud)
在阅读了本文以及有关片段状态丢失的各种StackOverflow问题后,我没有看到如何解决这个问题的好答案.
commitAllowingStateLoss()
(无条件)是一种可以隐藏真正错误的解决方法.OnClickListener
s和OnItemClickListener
s onSaveInstanceState
会100%防止这种情况,对于每个片段中的每个按钮来说,它都是PITA.isAdded()
,但我可以确认这不起作用.onSaveInstanceState()
并onRestoreInstanceState()
在onClick()中检查,但再次,这只是一个kludge.编辑:哦,片段没有onRestoreInstanceState()
,但我可以旋转国旗onResume()
或其他什么.是否有一个正确的解决方案,我错过了,或者我应该选择我的kludge?
对一些StackOverflow问题的评论指出,deadd00d的故障地址表示故意的VM中止.
I DEBUG : signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadd00d
Run Code Online (Sandbox Code Playgroud)
事实上,当通过ndk-stack运行日志时,我看到堆栈帧的顶部解码为:
Stack frame #00 pc 00050b0e /system/lib/libdvm.so (dvmAbort)
Run Code Online (Sandbox Code Playgroud)
然后评论说要在日志中查看问题.究竟我在寻找什么 - 是否有特定的标签或字符串可供搜索?(也许dalvikvm?)我滚动了很多页面的日志而没有找到任何相关的东西 - 这是正常的,还是应该在故障发生之前?
deadd00d最常发生在对GetObjectClass()的特定调用中.我试过在该行之前立即调用env-> ExceptionCheck,但它没有报告任何先前的错误.
我也试过打开CheckJNI
adb shell setprop debug.checkjni 1
Run Code Online (Sandbox Code Playgroud)
根据此处和此处的说明,但在杀死并重新启动应用程序时,我看不到预期的消息
D Late-enabling CheckJNI
Run Code Online (Sandbox Code Playgroud)
反而
D AndroidRuntime: CheckJNI is OFF
Run Code Online (Sandbox Code Playgroud)
使用adb shell getprop
表明该物业真的开启了,所以我不确定那里发生了什么.
看起来像这样的例外令人困惑:
FATAL EXCEPTION: main
java.lang.NullPointerException
at android.os.Parcel.readException(Parcel.java:1437)
at android.os.Parcel.readException(Parcel.java:1385)
at com.yourpackage.ipc.IYourClass$Stub$Proxy.yourMethod(IYourClass.java:488)
at com.yourpackage.ipc.YourClassShim.yourMethod(YourClassShim.java:269)
Run Code Online (Sandbox Code Playgroud)
我找到了一堆相关的问题,但没有一个回答"你如何调试这个".所以我正在提出这个问题/答案.
通过查看这里和这里的android源代码,你会看到它可以抛出任何这些(NullPointerException就是我所拥有的):
SecurityException(msg);
BadParcelableException(msg);
IllegalArgumentException(msg);
NullPointerException(msg);
IllegalStateException(msg);
RuntimeException("Unknown exception code: " + code + " msg " + msg);
Run Code Online (Sandbox Code Playgroud)
但究竟是什么导致了这些?
使用Android NDK,我有一个返回作业的本机方法 - 除了我忘记了return语句.不幸的是,这个编译没有警告,当我试图运行它时,只给了我一个0xdeadd00d的段错误.
虽然我最近主要在Java工作,所以我脑子里的错误信息是"缺少return语句",我相信gcc错误信息是"控制到达非void函数的结尾".
我想打开警告,并将其变成错误.我怎么做?(-Wall -Werror
由于我正在编译的现有代码库,简单地使用不是一个选项.)
为什么g++
给出这样的错误?
blahblah.h:80:10: error: decomposition declaration not permitted in this context
float[NUM_OUTPUTS] output_buffer;
Run Code Online (Sandbox Code Playgroud)
(已经解决,但是创建它是因为该错误文本没有良好的Google匹配,并且错误消息难以理解。)