【问题标题】:How do you debug Android inEclipse如何在 Eclipse 中调试 Android
【发布时间】:2011-05-15 22:22:25
【问题描述】:

尝试以下方法:

  1. 创建一个 HelloWorld 应用程序。

  2. 在 onCreate 末尾添加 Log 语句:

公共无效 onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); 设置内容视图(R.layout.main); Log.d("HelloWorldActivity.onCreate()", "setContentView() 完成"); }
  1. 在 Log 语句上放置一个断点。

  2. 在模拟器中运行应用程序并注意它的工作原理,然后逐步查看 Eclipse 的 LogCat 窗口中的 Logged 条目。

  3. 将 HelloWorldActivity 更改为从 ListActivity 而不是 Activity 扩展。

    公共类 HelloWorldActivity 扩展 ListActivity {
  4. 再次在模拟器中运行应用程序并注意它无法到达 Log 语句。

我的问题不是为什么会失败。我的问题是,您将如何调试此故障?我在 Eclipse 调试窗格中看到的只是一个 RuntimeException。我看到 LogCat 有一堆消息,但它很大,我已经搜索过它,但找不到任何东西来表明什么是错误的或在我的代码中发生异常的位置。我找不到在 RuntimeException 或堆栈跟踪中显示消息的方法,以了解哪一行代码引发了异常。

我认为必须有更好的方法来使用这些工具来查找错误,但我是新手,除了将我编写的所有代码都包装在 try/catch 中之外,似乎找不到更好的调试方法。我本来希望在引发异常的 LogCat 中找到一条消息。我本来希望调试窗口允许您检查异常的内容。我并不是说不存在这样的技术,我是说作为初学者我很难弄清楚如何调试并询问确实存在哪些技术以及如何使用它们?

所以,简单地说:

  • 如果您还不知道导致此错误的原因,您将如何发现该错误?
  • 您将使用哪些技术来找出根本原因?
  • 您将如何检查异常的详细信息?
  • 一般来说,您如何使用 Eclipse 发现 Android 代码中的问题?

欢迎多提建议和讨论。 :)

我会包含我的 LogCat 内容,但它太大了,不合理。你自己应该可以很容易地重现这个,所以我把它省略了。 LogCat 中可能有一些东西可以帮助我,但是因为它太大了,甚至运行一个小程序,我需要一个提示,说明在遇到 API 调用引发的异常时要搜索什么以及如何解释它。我看到其他帖子指出 LogCat 中应该有一些东西,虽然这可能是真的,但我自己没有找到任何东西。如果您认为 LogCat 中应该包含某些内容,请自行运行测试并将这些行复制到您应该找到的响应中。

谢谢。

========

目前总结的技术列表如下:

侵入性技术: 1. 在您希望看到您执行的代码位置放置一个 Toast。 2. 在您认为可能引发异常的代码周围放置 try/catch。 3. 注释掉代码,重新编译重新测试。

非侵入性技术: 1.使用调试器。断点、变量检查…… 2.猴子压力测试仪。 3.下载Android源码库。 4. 使用 LogCat 过滤器查看是否列出了“Caused By”。

不清楚是否可用: 1. 具有额外日志记录、断言或其他额外帮助的 Android 库的调试版本。 2. 能够通过调试窗格或其他技术在 Eclipse 中检查异常。 3. 一种定义更全局的 try/catch 异常处理程序的方法。 4.能够通过Android库源码进行调试。

不可用: 1. 一种查看异常内容或异常发生位置的非侵入性方式。

【问题讨论】:

  • 为了检查异常细节,我经常在调试模式下使用表达式窗口(窗口>显示视图>表达式)来检查值。这在检查异常时很方便,因为 exception.getMesage() 并不总是返回消息(即 null) 在调试模式下,在断点中右键单击变量并选择“监视”。您必须越过异常才能观看它。
  • Eclipse 中的“问题”窗口将显示预编译时错误,以及严格的警告。 (窗口>显示视图>其他...问题)
  • LogCat 起初是小姐领先。过滤器适用于消息而不是您的日志标签。要创建自定义过滤器,您应该使用 LogCat 菜单并选择“创建过滤器”选项。在这里,您可以按标签和 pid 进行过滤,从而为您提供更精细的控制。它也出现在选项卡式窗口中。隐藏系统事件非常有用。这些消息现在确实有助于最后的工作,但可能不会向您显示错误。所以轻弹回来显示所有系统事件。 (或按 pid 记录)

标签: android eclipse debugging exception logging


【解决方案1】:

嘿, 有趣的问题。好吧,第一个提示,您可以过滤 logcat 告诉您的内容。例如,您只需单击红色 (e) 即可显示错误。 如果您在调试模式下运行应用程序,它还会告诉您发生错误的位置。它可以直接将您指向您的代码或 android sdk。了解导致错误的 android 包是一个很大的帮助。

这两个突然出现在我的脑海中。希望有帮助!

【讨论】:

  • 是的,红色 (e) 似乎可以过滤,所以这是一个很大的帮助。您是否碰巧知道异常是否应该记录(e)错误、警告、信息?因为我没有看到任何东西,所以我不确定它应该是什么样子。如果是 (e) 错误,您的建议将大大减少消息数量。
  • 另外,关于“调试模式”。这只是您单击错误图标而不是简单地运行的地方,还是我应该加载一些调试库。我更像是一个 Windows 程序员,当我使用 MFC 时,他们有一个调试版本的库,因此您可以实际跟踪该源代码。 Android/Eclipse 有类似的东西吗?
  • 很好的建议。感谢分享。 :)
  • 我会给你一个赞,但显然我需要得到更高的评价才能做到这一点。对不起。 :(
【解决方案2】:

一般来说,如果有任何东西引发异常,那么无论如何您都应该适应这种情况,但是放置 try/catch 块是找到特定问题的一种不错的方法。 我发现如果你不在 catch 块中放一些东西,那么你就不能在 eclipse 的监视变量窗口中评估异常。所以我总是打一个 Log 调用并在该行设置一个断点。

public void onCreate(Bundle savedInstanceState) {
    try{
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }catch(Exception exception)
    {
        // put break point on line below so you can evaluate exception in debug mode.
        Log.e(TAG, "Set content exception "+ exception.getMessage());
        // note some exceptions return null on getMessage();
    }
    Log.d("HelloWorldActivity.onCreate()", "setContentView() completed");
}

因此,如果您的堆栈跟踪很大,那么这将有所帮助。其他开发人员也发现,获取 sdk 的源代码意味着您可以在主 sdk 代码中查看错误所在的位置。不过我还没有这样做。

【讨论】:

  • 拥有源代码会很有帮助。非常有帮助!我知道它是可用的,但我不确定你是否可以使用调试器来跟踪它。那将非常有帮助。是否有关于如何将其集成到调试会话中的说明?
  • 我理解你关于尝试/捕获任何可能引发异常的东西的观点。但是,有时您只是简单地测试代码并将其放在代码的每个小部分周围,在了解基础知识的同时非常麻烦。另外,如果您阅读了我的案例,一旦代码被修复,该异常就永远不会发生。都是一样的,好点和我提到的用于发现问题的技术之一。我认为如果不输入 try/catch 代码就无法获取异常的内容?
  • 如果在做测试代码,把所有的代码放在一个try catch中,然后为你想要管理的特定情况添加更多。至少这样你可以在抛出异常时节省时间,而且不需要太多努力。
  • 我发现在调试模式下显示的标准堆栈跟踪有些难以理解,因此使用 try/catch,但是通过阅读第一个大多数错误,我已经习惯了错误是什么。最常见的是它;不在清单文件、活动或权限中。空指针通常要么是错误的,内联侦听器代码的范围问题,要么是资产未附加或 id 更改。你一遇到问题就开始了解问题所在。
  • 您能解释一下如何进入“标准堆栈跟踪”吗?一旦发生异常,我将无法获得任何堆栈跟踪,这将有助于了解一旦发生异常,它位于何处。
【解决方案3】:

try/catch 未捕获的异常是错误,会破坏程序的正常流程。

在调试模式下运行只是单击错误按钮。我不知道是否有任何“特殊”调试库。但是在使用 android 时,所有“库”都是开源的,因此您几乎可以查看任何内容。

调试模式的好处是,当发生错误时,您的应用会在错误发生时被冻结在边缘。您可以设置断点,在程序运行时动态更改代码,这很棒(嗯,您不能像更改方法名称那样进行剧烈更改)。

但是,您在 android 中处理错误和错误的方式可能与 .NET 略有不同,因为每个模型中的模型都不同。

在 Windows 上编程时,应用就像小岛一样工作。您可以直接控制代码流(即:您可以在用户输入一些数据时调用模式对话框来冻结代码流),并且您可以只使用一个线程来制作一个功能齐全的程序。在 android 中,几乎所有东西都在它自己的同步中运行。你的应用程序必须准备好处理诸如在执行过程中接听电话之类的事情。因此,您也可以将此模型应用于调试:Errors (that happen due to unforsen circumstances) tend to propagate much more than in other development ambient。处理这些错误的方式也不同:当您意识到即使在抛出异常后您的应用程序仍然运行时,这一点很明显。

一些更有用的提示: 你有一个非常强大的工具,叫做 Monkey,这是一个压力工具,它可以生成“用户事件的伪随机流,例如点击、触摸或手势,以及一些系统- 级别事件”。

LogCat 向您指出错误的“原因”。该行通常以 Caused By 开头。如果您对原因而不是结果感兴趣,您可以进一步过滤您的错误报告以查找“Caused by”。

最后但并非最不重要的一点是,我发现了注释行的旧方法,看看发生了什么对于弄清楚事情非常有用。

希望对你有帮助

【讨论】:

  • 是的,我在另一个帖子中看到了“Caused By”,但是当我在我的 LogCat 中搜索它时,它没有出现。你试过我的例子,看看你是否得到了一个“原因”吗?我很好奇我是否应该看到我错过的东西。
  • 在我的示例中发生错误时,我的代码似乎没有冻结。似乎抛出了异常,并且由于我没有异常处理程序,因此我的代码只是退出了 Log 语句。也许我错过了调试器中可用的一些设置(例如 Break On Exception)?
  • 注释掉行是一个很好的建议。我一直在这样做。有点慢和麻烦,但绝对有效。一旦我得到这篇文章的所有建议,我将收集它们并将它们全部收集起来。也许我将它们重新发布在博客或与他人分享的内容中。谢谢。 :)
  • 在您的特定代码中,您的程序会在创建的第一个活动 main 处停止。所以基本上只有 super.onCreate(savedInstanceState);正在运行。试试这个:(1)创建一个新项目(2)在main中添加2个按钮(3)创建另一个有一些错误的活动(4)将一个按钮绑定到第二个活动(5)将第二个按钮绑定到Toat.makeText( 6)运行应用程序并单击第一个按钮...会发生错误。将出现一个警报,您单击确定,您的应用程序将继续运行,如果您单击按钮 2,它就会工作。如果您的按钮 2 会使用活动 2 的某种返回,这也是有效的。
【解决方案4】:

我遇到了同样的问题,发现 Steve H. 的以下内容有所帮助:

当调试器 已附加,异常日志不 发布到 LogCat 直到你 从内部终止应用程序 调试透视图。有时候是这样的 因为应用程序没有 实际上崩溃直到调试器 分离。 – 史蒂夫 H 3 月 31 日 15:47

----- 是的,做到了。现在我看到了同样的例外。在我让 程序运行完全崩溃 和退出过程。它应该显示 当它停止我的程序和 调出 IDE 调试器屏幕。 不要让我想知道和浪费我的 更多点击的时间。 Eclipse 似乎还有很长的路要走 与视觉之类的人竞争 工作室。希望我的耐心 比我的项目更持久。谢谢你 回馈。 :) – 塞巴斯蒂安·德沃尼克·马尔 31 点 17:35

问题链接:What's wrong with debugging in Eclipse on Android?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多