Java 为什么android logcat不显示运行时异常的堆栈跟踪?

Java 为什么android logcat不显示运行时异常的堆栈跟踪?,java,android,android-asynctask,logcat,runtimeexception,Java,Android,Android Asynctask,Logcat,Runtimeexception,我目前正在开发的一个android应用程序正在崩溃(已修复),这是由于本应引发IndexOutOfBoundsException的原因。我在扩展AyncTask的类的doInBackground方法中从变量参数(即string…)访问字符串。我无意中访问了一个单元素变量参数字符串的索引1(不是0)(有点尴尬…)。当应用程序第一次崩溃时,我查看了我的日志(并且多次确认我没有疯),没有找到运行时异常的堆栈跟踪。我经常撞坏我的手机,总是有一个很好的小堆栈跟踪让我看和修复,但我对此感到困惑。下面是我的l

我目前正在开发的一个android应用程序正在崩溃(已修复),这是由于本应引发IndexOutOfBoundsException的原因。我在扩展AyncTask的类的doInBackground方法中从变量参数(即string…)访问字符串。我无意中访问了一个单元素变量参数字符串的索引1(不是0)(有点尴尬…)。当应用程序第一次崩溃时,我查看了我的日志(并且多次确认我没有疯),没有找到运行时异常的堆栈跟踪。我经常撞坏我的手机,总是有一个很好的小堆栈跟踪让我看和修复,但我对此感到困惑。下面是我的logcat的相关部分(它不包含runtimeexception的堆栈跟踪),在导致崩溃的代码行之前的调试语句后面:

W/dalvikvm(25643): threadid=11: thread exiting with uncaught exception (group=0x40c281f8)
D/dalvikvm(25643): GC_CONCURRENT freed 1249K, 25% free 12433K/16455K, paused 2ms+6ms
W/dalvikvm(25643): threadid=15: thread exiting with uncaught exception (group=0x40c281f8)
I/Process (25643): Sending signal. PID: 25643 SIG: 9
I/ActivityManager( 5905): Process com.trade.nav.ges (pid 25643) has died.
W/ActivityManager( 5905): Force removing r: app died, no saved state
I/WindowManager( 5905): WIN DEATH: win
I/WindowManager( 5905): WIN DEATH: win
I/SurfaceFlinger( 1746): id=3848 Removed idx=2 Map Size=4
I/SurfaceFlinger( 1746): id=3848 Removed idx=-2 Map Size=4
I/WindowManager( 5905): WIN DEATH: win
I/power   ( 5905): *** acquire_dvfs_lock : lockType : 1  freq : 1000000 
D/PowerManagerService( 5905): acquireDVFSLockLocked : type : DVFS_MIN_LIMIT  frequency :  1000000  uid : 1000  pid : 5905  tag : ActivityManager
W/ActivityManager( 5905): mDVFSLock.acquire()
private class LoadImage extends AsyncTask<String, Integer, Bitmap> {
    String url = "";
    //...
    public LoadImage(ImageView iv, Context c) {
        //...
    }

    protected Bitmap doInBackground(String... urls) {
        // urls has one element
        url = urls[1];
        //...
    }
    //...
}
然后,另一项活动开始了。 以下是导致崩溃的代码供参考:

W/dalvikvm(25643): threadid=11: thread exiting with uncaught exception (group=0x40c281f8)
D/dalvikvm(25643): GC_CONCURRENT freed 1249K, 25% free 12433K/16455K, paused 2ms+6ms
W/dalvikvm(25643): threadid=15: thread exiting with uncaught exception (group=0x40c281f8)
I/Process (25643): Sending signal. PID: 25643 SIG: 9
I/ActivityManager( 5905): Process com.trade.nav.ges (pid 25643) has died.
W/ActivityManager( 5905): Force removing r: app died, no saved state
I/WindowManager( 5905): WIN DEATH: win
I/WindowManager( 5905): WIN DEATH: win
I/SurfaceFlinger( 1746): id=3848 Removed idx=2 Map Size=4
I/SurfaceFlinger( 1746): id=3848 Removed idx=-2 Map Size=4
I/WindowManager( 5905): WIN DEATH: win
I/power   ( 5905): *** acquire_dvfs_lock : lockType : 1  freq : 1000000 
D/PowerManagerService( 5905): acquireDVFSLockLocked : type : DVFS_MIN_LIMIT  frequency :  1000000  uid : 1000  pid : 5905  tag : ActivityManager
W/ActivityManager( 5905): mDVFSLock.acquire()
private class LoadImage extends AsyncTask<String, Integer, Bitmap> {
    String url = "";
    //...
    public LoadImage(ImageView iv, Context c) {
        //...
    }

    protected Bitmap doInBackground(String... urls) {
        // urls has one element
        url = urls[1];
        //...
    }
    //...
}
私有类LoadImage扩展了异步任务{
字符串url=“”;
//...
公共加载映像(ImageView iv,上下文c){
//...
}
受保护位图doInBackground(字符串…URL){
//URL有一个元素
url=url[1];
//...
}
//...
}
任何对正在发生的事情的洞察都会让我非常高兴,因为我很好奇在互联网上从未见过这样的事情。 谢谢


编辑:我没有筛选器集

您的线程显然正在崩溃(请注意
线程在同一进程中的两个不同线程上以未捕获异常退出
)。进程在自身之后正在清理--
发送信号
表示进程正在向自身发送致命信号。所以问题是,为什么在这两者之间看不到堆栈转储

堆栈转储来自,它是框架提供的全局未捕获异常处理程序。进程自湮灭发生在
finally
块中。除非
Slog.e
中的某些东西失败并抛出异常,否则很难找到不记录“致命异常”的方法来摆脱这种情况

我猜要么是在Slog.e中出现了故障,要么是有人替换了框架中未捕获的异常处理程序。如果您将一些外部库(如崩溃日志捕捉器或广告网络)合并到应用程序中,并且新的处理程序不会记录异常,但会终止进程,则可能会发生后一种情况


您可以通过附加Java语言调试器(例如Eclipse)来跟踪它。默认情况下,它将在未捕获异常时停止。从那里,您可以跟踪它,设置断点和单步执行未捕获异常处理程序(如果您有完整的源代码),等等。

根据fadden的猜测,外部库可能会覆盖未捕获异常处理程序,我开始调查任何可能的lib。结果表明,如果启用
enableExceptionReporting
,则
GoogleAnalytics
会阻止崩溃并阻止堆栈跟踪显示在logcat中。我删除这行代码,然后一切都回到正轨!!这可能是我第一次如此高兴地看到撞车

您是否尝试将异常代码放入try Catch块?是否确实未选择任何筛选器?…问题不是我需要阻止代码引发运行时异常,我已经在另一个版本的代码中这样做了(将数字1更改为0)。问题是,旧版本的代码从未导致运行时异常堆栈跟踪显示在我的logcat中。我想知道为什么会这样。我根本没有选择过滤器。我使用命令行工具进行开发,尽管我熟悉使用eclipse。我只是简单地使用命令“adb logcat”并接收所有未经过滤的logcat结果。非常感谢。我计划更多地在家里研究它,因为我找不到时间工作。我没有任何第三方库会影响到这一点(尽管我会检查我用作库的图像编辑器Aviary是否做了类似的事情),而且我仍然在我的logcat中看到其他堆栈转储(应该是这样),所以我继续感兴趣。非常感谢您及时和充分的建议。祝你有愉快的一天。很遗憾,默认实现在没有提及任何异常抛出的情况下终止了进程。任何能让程序员知道发生了什么的东西。