如何在Android应用程序中获取错误行号?

时间:2014-01-29 22:10:29

标签: android debugging

目前,当我的应用程序出错时,我得到一个我完全不认识的堆栈跟踪(不包含我定义的任何类),因此调试需要始终添加至少1个断点然后执行跟踪通过我的代码。

如何设置Eclipse以便在发生错误时我在实际应用程序中获取导致错误的行号? (从而给我一个更好的机会立即修复,而无需经过额外的调试步骤)

下面复制的是我没有重新编写的堆栈跟踪。我尝试暂停其他线程,以防我的代码在那里,但它无处可寻。

GoogleImageSearch [Android Application] 
DalvikVM[localhost:8606]    
    Thread [<1> main] (Suspended)   
        <VM does not provide monitor information>   
        ViewRootImpl.performMeasure(int, int) line: 2135    
        ViewRootImpl.measureHierarchy(View, WindowManager$LayoutParams, Resources, int, int) line: 1286 
        ViewRootImpl.performTraversals() line: 1497 
        ViewRootImpl.doTraversal() line: 1183   
        ViewRootImpl$TraversalRunnable.run() line: 4863 
        Choreographer$CallbackRecord.run(long) line: 749    
        Choreographer.doCallbacks(int, long) line: 562  
        Choreographer.doFrame(long, int) line: 532  
        Choreographer$FrameDisplayEventReceiver.run() line: 735 
        Handler.handleCallback(Message) line: 725   
        Choreographer$FrameHandler(Handler).dispatchMessage(Message) line: 92   
        Looper.loop() line: 137 
        ActivityThread.main(String[]) line: 5328    
        Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]  
        Method.invoke(Object, Object...) line: 511  
        ZygoteInit$MethodAndArgsCaller.run() line: 1102 
        ZygoteInit.main(String[]) line: 869 
        NativeStart.main(String[]) line: not available [native method]  
    Thread [<10> Binder_2] (Suspended)  
        <VM does not provide monitor information>   
        NativeStart.run() line: not available [native method]   
    Thread [<9> Binder_1] (Suspended)   
        <VM does not provide monitor information>   
        NativeStart.run() line: not available [native method]   

编辑:为了解决我的应用程序特有的可能导致我的源从堆栈跟踪中丢失的可能性,我使用Eclipse的New Android Application向导创建了一个HelloWorld应用程序。它在空白屏幕上运行良好。然后我在MainActivity的{​​{1}}:onCreate添加了一行。然后我得到了这个(请注意,MainActivity.java不会出现在堆栈中的任何位置,这让我想知道显示堆栈信息提供的值是什么。必须有一种方法来自定义它。)

long l = 100 / 0

FINAL_EDIT :此问题基于错误的假设,即调试器能够检测错误并相应地挂起线程。它可以在使用LogCat报告任何错误之前挂起线程。如果我只是继续恢复线程,直到应用程序因错误而终止,LogCat可能在我上面列出的所有案例中都运行得很好。

3 个答案:

答案 0 :(得分:1)

我认为你可以在eclipse中查看LogCat窗口时找到错误行,出现的错误应该显示一行“引起了...”并且接下来几行应该识别导致错误的行(行号应该在错误行的末尾)

如果您没有看到LogCat窗口通过Window-&gt;启用它显示视图 - &gt;其他 - &gt; Android-&GT; Logcat

答案 1 :(得分:0)

问题是由于活动的onCreate方法中发生错误引起的。通过观察(我没有备份此语句的文档),似乎作为应用程序“bootstrap”进程的一部分运行的方法的处理方式与应用程序“正常”生命周期中发生的错误不同。

我通过从onCreate中取出代码并将其添加到我通过单击我添加到布局中的虚拟按钮调用的另一个方法来解决这个问题。一旦我调试了代码,我就会把它放回onCreate

对于Android,我绝对需要针对此案例的长期解决方案。

编辑:错误也开始出现在LogCat中,以前没有提供过。

ANOTHER_EDIT :我也发现了这个解决方案中的技术不起作用的情况(回到同一个应用程序失败的问题,LogCat中没有输出我的应用程序的日志消息)。这些案例会使我的解决方案不完整,所以我现在不会将其标记为答案。

答案 2 :(得分:0)

LogCat是获取导致Android应用程序错误的行号的可靠方法。不报告错误的一个原因可能是调试器在调用LogCat报告未处理的异常之前挂起受异常影响的一个或多个线程。在这种情况下,您有一个显示异常类型的挂起线程,但没有来自LogCat的输出。

如果使用调试器运行应用程序,那么只需确保恢复线程,直到应用程序终止并发生致命错误,即您将获得LogCat输出。可能需要多次取消暂停才能使其获得LogCat消息。

但是这种技术引出了一个问题 - 为什么要使用调试器,如果在线程暂停时你没有被带到导致错误的代码源?

我使用的解决方案就是尽可能在没有调试器的情况下运行我的应用程序。