我正在开发一个应用程序,每次运行它时,我都会收到消息:
不幸的是,MyApp已经停止了。
我能做些什么来解决这个问题?
关于这个问题-显然是受到什么是堆栈跟踪,以及如何使用它来调试我的应用程序错误?
此答案描述了检索堆栈跟踪的过程。已经有堆栈跟踪了吗?在"中阅读堆栈跟踪,什么是堆栈跟踪,如何使用它来调试我的应用程序错误?"
您的应用程序退出是因为抛出了一个未捕获的RuntimeException。其中最常见的是NullPointerException。
RuntimeException
NullPointerException
每当Android应用程序(或任何Java应用程序)崩溃时,都会将Stack trace写入控制台(在本例中为logcat)。此堆栈跟踪包含解决问题的重要信息。
Stack trace
在窗口的底部栏中,单击Logcat按钮。或者,您可以按alt+6。确保在Devices面板中选择了您的模拟器或设备。接下来,尝试查找堆栈跟踪,红色显示。可能有很多东西登录到logcat中,因此您可能需要滚动一下。找到堆栈跟踪的一个简单方法是清除logcat(使用右侧的回收站),然后让应用程序再次崩溃。
Logcat
Devices
耶!你的问题已经解决一半了。您只需要通过分析堆栈跟踪来找出究竟是什么导致您的应用程序崩溃。
在“什么是堆栈跟踪,如何使用它来调试我的应用程序错误?”中读取堆栈跟踪
如果你已经找到了你的Exception和它发生的行,仍然不知道如何修复它,不要犹豫,在StackOverflow上提出问题。
Exception
尽量简洁:发布堆栈跟踪和相关代码(例如,几行到抛出Exception的行)。
首先,您检查您的应用程序在哪个点崩溃(Unfortunately, MyApp has stopped.)。为此,您可以使用Log.e("TAG", "Message");,使用这一行您可以在logcat中看到您的应用程序登录。
Unfortunately, MyApp has stopped.
Log.e("TAG", "Message");
之后,您会发现您的应用程序停止了哪个点,这在您身边很容易解决。
您还可以自行获取此错误消息,而无需任何堆栈跟踪或任何进一步的错误消息。
在这种情况下,您需要确保您的Android清单配置正确(包括从库发生的任何清单合并以及来自库的任何活动),并特别注意您的应用程序中显示在清单文件中的第一个活动。
您可以使用谷歌的ADB工具获取Logcat file来分析问题。
Logcat file
adb logcat > logcat.txt
打开logcat.txt文件并搜索您的应用程序名称。应该有关于失败原因、行号、类名等的信息。
logcat.txt
只需检查日志猫中的错误。
您可以从eclipse中获得log cat选项:
窗口->显示视图->其他->Android->Logcat
日志猫包含错误。
另一方面,您也可以通过在调试模式下执行应用程序来检查错误。首先通过执行以下操作设置断点:
右键单击项目->调试为->Android应用程序
检查您的Logcat消息并查看您的Manifest文件。应该缺少一些东西,例如定义Activity,User权限等。
Manifest
Activity,
你必须检查Stack trace
如何做到这一点?
在您的IDE上检查LOGCAT窗体的窗口
如果您看不到logcat窗口,请转到此路径并打开它
window->show view->others->Android->Logcat
如果您使用的是Google-Api,请转到此路径
adb logcat>logcat.txt
您可以使用这些工具中的任何一个:
adb logcatadb logcat>logs.txt(您可以使用编辑器打开和搜索错误。)eclipse logcat(如果在eclipse中不可见,请转到Windows->显示视图->其他->Android->LogCat)Android调试监视器或Android设备监视器(键入命令监视器或通过UI打开)
adb logcat
adb logcat>logs.txt(您可以使用编辑器打开和搜索错误。)
eclipse logcat(如果在eclipse中不可见,请转到Windows->显示视图->其他->Android->LogCat)
Android调试监视器或Android设备监视器(键入命令监视器或通过UI打开)
androidStudio
我建议使用Android调试监视器,这很好。因为当有太多日志时,eclipse会挂起,并且通过adb logcat过滤器和所有困难。
使用LogCat并尝试查找导致应用程序崩溃的原因。
要查看Logcat,如果您使用androidStudio,请按ALT+6或
如果您使用Eclipse,则窗口->打开视角->其他-LogCat
转到LogCat,从下拉菜单中选择错误。这将包含帮助您调试的所有必需信息。如果这没有帮助,请将LogCat作为问题的编辑发布,有人会帮助您解决问题。
让我分享一个基本的Logcat分析,用于当您遇到强制关闭(当应用程序停止工作时)。
DOCS
从Android收集/分析日志的基本工具是logcat。
这里是关于logcat的Android页面
如果您使用android Studio,您也可以检查此LINK。
捕获
基本上,您可以使用以下命令手动捕获logcat(或仅检查AndroidStudio中的AndroidMonitor窗口):
你可以在命令中添加很多参数,这些参数可以帮助你过滤和显示你想要的消息……这是个人的……我总是使用下面的命令来获取消息时间戳:
adb logcat -v time
您可以将输出重定向到文件并在文本编辑器中对其进行分析。
分析
如果您的应用程序崩溃,您将获得以下内容:
07-09 08:29:13.474 21144-21144/com.example.khan.abc D/AndroidRuntime: Shutting down VM07-09 08:29:13.475 21144-21144/com.example.khan.abc E/AndroidRuntime: FATAL EXCEPTION: mainProcess: com.example.khan.abc, PID: 21144java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.onBackPressed()' on a null object referenceat com.example.khan.abc.AudioFragment$1.onClick(AudioFragment.java:125)at android.view.View.performClick(View.java:4848)at android.view.View$PerformClick.run(View.java:20262)at android.os.Handler.handleCallback(Handler.java:815)at android.os.Handler.dispatchMessage(Handler.java:104)at android.os.Looper.loop(Looper.java:194)at android.app.ActivityThread.main(ActivityThread.java:5631)at java.lang.reflect.Method.invoke(Native Method)at java.lang.reflect.Method.invoke(Method.java:372)at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)07-09 08:29:15.195 21144-21144/com.example.khan.abc I/Process: Sending signal. PID: 21144 SIG: 9
这部分日志向您展示了很多信息:
07-09 08:29:13.475
检查问题发生的时间很重要……您可能会在日志中发现几个错误……您必须确保检查的是正确的消息:)
com.example.khan.abc
这样,您就知道哪个应用程序崩溃了(以确保您正在检查有关消息的日志)
java.lang.NullPointerException
空指针异常错误
Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.onBackPressed()' on a null object reference
您尝试从FragmentActivity对象调用方法onBackPressed()。然而,当您这样做时,该对象是null。
FragmentActivity
onBackPressed()
null
堆栈跟踪:堆栈跟踪向您显示方法调用顺序……有时,错误发生在调用方法中(而不是在被调用的方法中)。
com.example.khan.abc.1.on点击(AudioFragment.java:125)
错误发生在文件com.example.khan.abc.AudioFragment.java中,在onClick()方法中的第125行(stacktrac显示发生错误的行)
com.example.khan.abc.AudioFragment.java
onClick()
125
它被称为:
at android.view.View.performClick(View.java:4848)
at android.view.View$PerformClick.run(View.java:20262)
at android.os.Handler.handleCallback(Handler.java:815)
等等……
概览
这只是一个概述……并非所有日志都很简单,但错误给出了具体问题,详细显示了所有问题……这只是为了分享想法并为您提供入门级信息……
我希望我能以某种方式帮助你…问候
备注:此答案使用Android Studio 2.2.2
注2:我正在考虑您的设备已成功连接。
当应用程序崩溃时,您要做的第一件事就是查看LogCat,在Android Studio的底部有一个工具栏,其中包含菜单列表:
单击“Android监视器”(我在上图中下划线的那个。^)
现在,你会得到这样的东西:
将“Verbose”更改为“Error”现在它只会显示记录的错误。现在不要担心所有这些错误(如果你有的话)。
Verbose
Error
好的。现在,做你所做的使应用程序崩溃的操作。应用程序崩溃后,转到你的logcat。你应该找到一个新的崩溃日志,其中包含很多at:x.x.x:和Caused by: TrumpIsPresidentException,例如。转到logcat中的Caused by:语句。
at:x.x.x
Caused by: TrumpIsPresidentException
Caused by:
旁边即Caused By:,应该有发生的异常。在我的情况下,它是RuntimeException和在它,应该有一行包含蓝色链接,例如:
Caused By:
如果#0下面没有带有蓝色文本的行,然后寻找另一个Caused by:。
点击那个蓝色链接。它应该带你到问题发生的地方。在我的例子中,它是由于这一行:
throw new RuntimeException();
所以,现在我知道它为什么崩溃了。这是因为我自己抛出了异常。这是个明显的错误。
但是,假设我有另一个错误:
我检查了我的logcat,我点击了它给我的蓝色链接,它把我带到了这里:
mTextView.setText(myString);
所以,现在我想调试。根据这个StackOverflow问题,NullPointerException表示某物为null。
所以,让我们找出什么是null。有两种可能性。要么mTextView为空,要么myString为空。为了找出答案,在mTextView.setText(mString)行之前,我添加了这两行:
mTextView
myString
mTextView.setText(mString)
Log.d("AppDebug","mTextView is null: " + String.valueOf(mTextView == null);Log.d("AppDebug","myString is null: " + String.valueOf(myString== null);
现在,就像我们之前所做的(我们将Verose更改为Error),我们想将“Error”更改为“Debug”。因为我们是通过调试来记录的。这是所有的日志方法:
Log.d means Debuge means errorw means warningv means verbosei means informationwtf means "What a terrible failure". This is similar to Log.e
因此,由于我们使用了Log.d,我们正在签入Debug。这就是为什么我们将其更改为debug。
Log.d
注意Log.d有第一个参数,在我们的例子中是“AppDebug”。单击logcat右上角的“无过滤器”下拉菜单。选择“编辑过滤器配置”,为您的过滤器命名,然后在“日志标签”中放入“应用程序调试”。单击“确定”。现在,您应该在logcat中看到两行:
yourPackageNameAndApp: mTextView is null: trueyourPackageNameAndApp: myString is null: false
所以现在我们知道mTextView为空。
我观察我的代码,现在我注意到一些东西。
我已经在我的类的顶部声明了private TextView mTextView。但是,我没有定义它。
private TextView mTextView
基本上我忘记在我的onCreate()中执行此操作:
mTextView = (TextView) findViewById(R.id.textview_id_in_xml);
这就是为什么mTextView为空,因为我忘记告诉我的应用程序它是什么。所以我添加了那行,运行我的应用程序,现在应用程序没有崩溃。
在下面的showToast()方法中,您必须为上下文或应用程序上下文传递另一个参数,这样您就可以尝试了。
public void showToast(String error, Context applicationContext){LayoutInflater inflater = getLayoutInflater();View view = inflater.inflate(R.layout.custom_toast, (ViewGroup)findViewById(R.id.toast_root));TextView text = (TextView) findViewById(R.id.toast_error);text.setText(error);Toast toast = new Toast(applicationContext);toast.setGravity(Gravity.TOP | Gravity.FILL_HORIZONTAL, 0, 0);toast.setDuration(Toast.LENGTH_SHORT);toast.setView(view);toast.show();}
此弹出窗口仅在您的代码中出现停止应用程序执行的致命异常时显示。它可能是任何异常NullPointerException、OutOfMemoryException等。
OutOfMemoryException
如果您仍在Android Studio中开发应用程序,最好的检查方法是通过Logcat,这是读取堆栈跟踪并检查应用程序原因的快速方法。
如果您的应用程序已经上线,那么您不能使用logcat。因此,您可以实现Crashlytics来为您提供发生的任何异常的bug报告。
Crashlytics
如果您的应用程序由于某种原因在没有良好的堆栈跟踪的情况下崩溃。尝试从第一行调试它,然后一行一行地进行直到崩溃。然后您将得到答案,哪一行给您带来了麻烦。很可能您可以将其包装到try cat块并打印错误输出。
人们会犯错误,编码也是如此。
当任何error发生时,总是用红色文本的logcat检查,但是你可以在那些红色文本中找到带下划线的蓝色文本中的实际问题。
error
确保如果你创建了一个新的activity,总是在AndroidManifest文件中声明activity。
activity
AndroidManifest
如果添加权限,也在AndroidMainifest文件中声明它。
AndroidMainifest
尝试我最喜欢的工具logview来获取日志并在开发过程中分析它们。确保在Linux中运行时将./logview和./lib/logview.jar标记为可执行文件。
./logview
./lib/logview.jar
如果你不喜欢它,有很多选择适用于Android的桌面日志查看器。
集成实时崩溃报告工具,例如Firebase Crashlytics,以获取用户设备上发生的未处理异常的堆栈跟踪。
阅读如何发布Buggy应用程序(并现场讲述故事)以了解有关处理字段中错误的更多信息。
Logcat-查看Android Studio开发阶段的日志
最初清除Logcat并让应用程序再次崩溃,以便您只能获得崩溃的日志详细信息。您必须检查堆栈跟踪
虽然,不幸的是,MyApp已经停止。它有很多原因。您可以在日志中检查相同的内容。为此,您可以使用Log. e(“TAG”、“Message”);
应用程序崩溃期间的常见错误,例如:
解决应用程序崩溃错误:
首先,您需要检查您的应用程序在何处以及为什么崩溃(Unfortunately, MyApp has stopped.).在LOG的帮助下,您可以找出出了什么问题。
(Unfortunately, MyApp has stopped.).
LOG
之后,您会发现您的应用程序已停止从您的点修复该点。
如果你的终端中没有任何有趣的日志(或者它们与你的应用程序没有直接关系),也许你的问题是由于本机库。在这种情况下,你应该检查终端中的“墓碑”文件。
墓碑文件的默认位置取决于每个设备,但如果是这种情况,您将有一个日志告诉:Tombstone written to: /data/tombstones/tombstone_06
Tombstone written to: /data/tombstones/tombstone_06
有关更多信息,请查看https://source.android.com/devices/tech/debug。
在终端中运行此命令也可以帮助找到问题:
gradlew build > log.txt 2>details.txt
然后您应该转到gradlew文件位置以读取上面的两个日志文件。
如果您的应用程序崩溃了没有任何错误和你没有用资产经理,但加载了以下纹理:
Texture texture = new Texture("myImage.png"); //dont to this all the time
这就是问题所在。我遇到了这种情况。您应该始终使用资产管理器来避免内存过载。
我会建议这样的东西。
检查您的手机是否有足够的空间让应用程序可以运行------之前/
当应用程序崩溃时检查logcat。它将显示应用程序崩溃的确切行。
检查您是否在主线程上使用了由于ANR而使用大量内存的东西。
检查您的Logcat消息。此外,请参阅您的清单文件以查找缺失的元素,例如定义Activity、User permission等。
Activity
User permission
要查看Logcat,如果您使用androidStudio,请按alt+6或
现在,从下拉菜单中选择错误。
<强>或者强>,您可以使用ADB工具获取Logcat file来分析问题。
现在打开logcat.txt文件并搜索您的应用程序名称。应该有关于失败原因、行号、类名等的信息。