APP出现crash(崩溃)总是不能忍的

当我们连接调试器调试的时候,发现每当APP崩溃的时候

程序都会走到App.xaml.cs中的

  1. // Code to execute on Unhandled Exceptions
  2. private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
  3. {
  4. if (System.Diagnostics.Debugger.IsAttached)
  5. {
  6. // An unhandled exception has occurred; break into the debugger
  7. System.Diagnostics.Debugger.Break();
  8. }
  9.  
  10. }

然而,我们并不是时时刻刻保持连接在电脑的调试器上的

因此,有必要将造成crash的信息,尽量的保存下来

可以采用写入LOG的方式

ApplicationUnhandledExceptionEventArgs 类

ApplicationUnhandledExceptionEventArgs.ExceptionObject 属性,是关键

  1. public Exception ExceptionObject { get; set; }

因此,记录下对你有用的信息吧!

  1. // 摘要:
  2. // 初始化 System.Exception 类的新实例。
  3. public Exception();
  4. //
  5. // 摘要:
  6. // 使用指定的错误消息初始化 System.Exception 类的新实例。
  7. //
  8. // 参数:
  9. // message:
  10. // 描述错误的消息。
  11. public Exception(string message);
  12. //
  13. // 摘要:
  14. // 使用指定的错误消息和对导致此异常的内部异常的引用来初始化 System.Exception 类的新实例。
  15. //
  16. // 参数:
  17. // message:
  18. // 解释异常原因的错误消息。
  19. //
  20. // innerException:
  21. // 导致当前异常的异常;如果未指定内部异常,则是一个空引用(在 Visual Basic 中为 Nothing)。
  22. public Exception(string message, Exception innerException);
  23.  
  24. // 摘要:
  25. // 获取一个提供用户定义的其他异常信息的键/值对的集合。
  26. //
  27. // 返回结果:
  28. // 一个对象,它实现 System.Collections.IDictionary 接口并包含用户定义的键/值对的集合。默认值为空集合。
  29. public virtual IDictionary Data { get; }
  30. //
  31. // 摘要:
  32. // 获取或设置指向此异常所关联帮助文件的链接。
  33. //
  34. // 返回结果:
  35. // 统一资源名称 (URN) 或统一资源定位器 (URL)。
  36. public virtual string HelpLink { get; set; }
  37. //
  38. // 摘要:
  39. // 获取或设置 HRESULT(一个分配给特定异常的编码数字值)。
  40. //
  41. // 返回结果:
  42. // HRESULT 值。
  43. public int HResult { get; protected set; }
  44. //
  45. // 摘要:
  46. // 获取导致当前异常的 System.Exception 实例。
  47. //
  48. // 返回结果:
  49. // 一个 Exception 实例,描述导致当前异常的错误。InnerException 属性返回与传递给构造函数的值相同的值,或者,如果没有向构造函数提供内部异常值,则返回空引用(在
  50. // Visual Basic 中为 Nothing)。此属性为只读。
  51. public Exception InnerException { get; }
  52. //
  53. // 摘要:
  54. // 获取描述当前异常的消息。
  55. //
  56. // 返回结果:
  57. // 解释异常原因的错误消息或空字符串 ("")。
  58. public virtual string Message { get; }
  59. //
  60. // 摘要:
  61. // [安全关键] 获取或设置导致错误的应用程序或对象的名称。
  62. //
  63. // 返回结果:
  64. // 导致错误的应用程序或对象的名称。
  65. public virtual string Source { get; set; }
  66. //
  67. // 摘要:
  68. // 获取在引发当前异常时调用堆栈上帧的字符串表示形式。
  69. //
  70. // 返回结果:
  71. // 一个字符串,它描述调用堆栈的内容,其中首先显示最近的方法调用。
  72. public virtual string StackTrace { get; }
  73.  
  74. // 摘要:
  75. // 当在派生类中重写时,返回 System.Exception,它是一个或多个后续异常的根源。
  76. //
  77. // 返回结果:
  78. // 异常链中第一个被引发的异常。如果当前异常的 System.Exception.InnerException 属性是空引用(在 Visual Basic
  79. // 中为 Nothing),则此属性返回当前异常。
  80. public virtual Exception GetBaseException();
  81. //
  82. // 摘要:
  83. // 获取当前实例的运行时类型。
  84. //
  85. // 返回结果:
  86. // 一个 System.Type 对象,表示当前实例的确切运行时类型。
  87. public Type GetType();
  88. //
  89. // 摘要:
  90. // 创建并返回当前异常的字符串表示形式。
  91. //
  92. // 返回结果:
  93. // 当前异常的字符串表示形式。
  94. [SecuritySafeCritical]
  95. public override string ToString();

我一般是这样:

  1. private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
  2. {
  3. if (System.Diagnostics.Debugger.IsAttached)
  4. {
  5. // An unhandled exception has occurred; break into the debugger
  6. System.Diagnostics.Debugger.Break();
  7. }
  8. Logger.WriteLog("Application_UnhandledException object:" + sender.ToString());
  9. Logger.WriteLog("Application_UnhandledException e.ExceptionObject.Message:" + e.ExceptionObject.Message);
  10. Logger.WriteLog("Application_UnhandledException e.ExceptionObject.Source:" + e.ExceptionObject.Source);
  11. Logger.WriteLog("Application_UnhandledException e.ExceptionObject.StackTrace:" + e.ExceptionObject.StackTrace);
  12.  
  13. }

最后提一点:

国外的一个网站,https://www.bugsense.com

针对各个移动平台

提供了很好的BUG REPORT解决方案

windows phone中,将crash report记录下来,写入文件,方便分析的更多相关文章

  1. 【干货】查看windows文件系统中的数据—利用簇号查看文件与恢复文件

    前面我们使用这个软件发现了很多删除掉的数据,今天来看看簇.FAT文件系统中,存在一个簇的链接,我知道了簇1在哪里就可以顺藤摸瓜恢复所有的信息. 这里使用FAT 12为例子,FAT其他万变不离其宗,甚至 ...

  2. Windows系统中,循环运行.bat/.exe等文件

    一.创建循环运行的run-everySecond.vbs文件[双击次文件即可启动运行] dim a set a=CreateObject("Wscript.Shell") Do # ...

  3. C#中using的使用-以FileStream写入文件为例

    场景 CS中FileStream的对比以及使用方法: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/100396022 关注公众号 ...

  4. 将List<Map>中的datas转换为json格式写入文件

    private static boolean writeToTextFileByJson(List<Map<String, Object>> datas, String tit ...

  5. vim中 E212:无法打开并写入文件 的解决办法

    因为centos7刚安装的时候是无法上网的,所以,需要去配置一下ifcfg-ens33文件,但实际上这个文件是只读的文件,root也无法去更改内容,这时候保存的时候需要使用 w ! sudo tee ...

  6. Chrome的Crash Report服务

    <本文转自:http://www.cppblog.com/woaidongmao/archive/2009/10/22/99211.aspx> 本文翻译自debugInfo网站上一篇文章g ...

  7. Windows系统调用中的现场保存

    Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html Windows系统调用中的现场保存 我们之前介绍过三环进零环的步骤 ...

  8. windows系统中的dll的作用详细解释

    什么是.DLL文件? DLL 是一个包含可由多个程序同时使用的代码和数据的库.例如,在 Windows 操作系统中,Comdlg32 DLL 执行与对话框有关的常见函数.因此,每个程序都可以使用该 D ...

  9. 浅谈Android Studio中项目结构中project模式的各个文件和文件夹

    致敬郭霖,这些知识是从第一行代码第二版中直接码下来的,谢谢他,注意每个条目前是否有. 1..gradle和.idea 这两个目录下放置的都是Android Studio自动生成的一些文件,我们无需关心 ...

随机推荐

  1. 编译不通过:提示XXXX不是类或命名空间名 的解决办法

    手动写了一个类,需要引入预编译头stdafx.h.结果编译时提示XXXX不是类或命名空间名. 处理方法:将#include "stdafx.h"放在最前面.

  2. 案例:用JS实现放大镜特效

    案例:用JS实现放大镜特效 案例:用JS实现放大镜特效

  3. STL List容器

    转载http://www.cnblogs.com/fangyukuan/archive/2010/09/21/1832364.html 各个容器有很多的相似性.先学好一个,其它的就好办了.先从基础开始 ...

  4. sleep()函数的的意义

    ===============WINDOWS平台下:====================== 关于VOID Sleep(DWORD dwMilliseconds);函数,许多人都觉得,它是告诉系统 ...

  5. SQUEEZENET: ALEXNET-LEVEL ACCURACY WITH 50X FEWER PARAMETERS AND <0.5MB MODEL SIZE

    论文阅读笔记 转载请注明出处: http://www.cnblogs.com/sysuzyq/p/6186518.html By 少侠阿朱

  6. .net 4.5 新特性 async await 一般处理程序实例

    using System; using System.Collections.Generic; using System.Linq; using System.Threading; using Sys ...

  7. C#/.Net Post获取数据流的一种简单写法

    最近在弄一些第三方的平台,经常调用第三方的接口实现某些特定的功能 在实现的同时基本上都需要本地的数据经过服务器在Request到第三方的服务器中处理,再返回相应的数据结构体:json/xml 以下是我 ...

  8. JS数组追加数组采用push.apply的坑(转)

    JS数组追加数组没有现成的函数,这么多年我已经习惯了a.push.apply(a, b);这种自以为很酷的,不需要写for循环的写法,一直也没遇到什么问题,直到今天我要append的b是个很大的数组时 ...

  9. AJAX 控件集之TextBoxWatermark(水印文本框)控件

    功能:       可以让TextBox控件初始化的时候拥有水印文字.属性:    TargetControlID :要使用具有水印效果的TextBox控件ID.    WatermarkCssCla ...

  10. 自定义tableviewCell的分割线

    第一种:addsubview UIView *line = [[UIView alloc]initWithFrame:CGRectMake(10, cellH-0.5, DEVW-10, 0.5)]; ...