java crash

作者:原创时间:2022-03-29
文档

java crash是什么,让我们一起了解一下:

Crash就是由于代码异常而导致App非正常退出现象,也就是常说的崩溃。在工作目录下会产生一个日志文件,而java crash通过简单的方式就能够捕获到异常。

那么在java进程中crash产生错误了怎么办?

如果有一个严重的错误引起Java进程非正常退出,我们叫Crash,这时候会产生一个日志文件,缺省情况下,这个文件会产生在工作目录下,但是,可以在Java启动参数通过下面的设置,来改变这个文件的位置和命名规则。例如:java -XX:ErrorFile=/var/log/java/java_error_%p.log。就将这个错误文件放在/var/log/java下,并且以java_error_pid.log的形式出现。

  1. #!/usr/sbin/dtrace -qs
    proc:::signal-send
    /args[1]->pr_pid == $1/
    {
    printf("%s(pid:%d) is sending signal %d to %s"n", execname, pid, args[2],args[1]->pr_fname);
    }

案例分析java crash的具体使用:以Android Crash之Java Crash为例。

首先我们要了解Android的Crash类型,那在Android中通常有两种Crash类型,分别是Java Crash和Native Crash。

Java Crash在Android上的特点是什么?
1、这类错误一般是由Java层代码触发的。
2、一般情况下程序出错时会弹出提示框,JVM虚拟机退出。
3、一般的Crash工具都能够捕获,系统也提供了API。

我们通过UncaughtExceptionHandler来记录dump异常日志代码如下:

package com.devilwwj.androidcrashdemo;
/**
 * com.devilwwj.androidcrashdemo
 * Created by devilwwj on 16/5/27.
 */
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Build;
import android.os.Environment;
import android.os.Process;
import android.util.Log;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.Thread.UncaughtExceptionHandler;
import java.text.SimpleDateFormat;
import java.util.Date;
public class CrashHandler implements UncaughtExceptionHandler {
    private static final String TAG = "CrashHandler";
    private static final boolean DEBUG = true;
    private static final String PATH = Environment
            .getExternalStorageDirectory() + "/CrashDemo/log/";
    private static final String FILE_NAME = "crash";
    private static final String FILE_NAME_SUFFIX = ".trace";
    private static final String ABOLUTE_PATH = PATH + FILE_NAME + FILE_NAME_SUFFIX;
    private String deviceToken;
    private static CrashHandler sInstance = new CrashHandler();
    private UncaughtExceptionHandler mDefaultCrashHandler;
    private Context mContext;
    private CrashHandler() {
    }
    public static CrashHandler getInstance() {
        return sInstance;
    }
    public void init(Context context) {
        mDefaultCrashHandler = Thread.getDefaultUncaughtExceptionHandler();
        Thread.setDefaultUncaughtExceptionHandler(this);
        mContext = context.getApplicationContext();
    }
    /**
     * 这个是最关键的函数,当程序中有未被捕获的异常,系统将会自动调用#uncaughtException方法
     * thread为出现未捕获异常的线程,ex为未捕获的异常,有了这个ex,我们就可以得到异常信息。
     */
    @Override
    public void uncaughtException(Thread thread, Throwable ex) {
        try {
            // 导出异常信息到SD卡中
            dumpExceptionToSDCard(ex);
        } catch (IOException e) {
            e.printStackTrace();
        }
        ex.printStackTrace();
        // 如果系统提供了默认的异常处理器,则交给系统去结束我们的程序,否则就由我们自己结束自己
        if (mDefaultCrashHandler != null) {
            mDefaultCrashHandler.uncaughtException(thread, ex);
        } else {
            Process.killProcess(Process.myPid());
        }
    }
    private File dumpExceptionToSDCard(Throwable ex) throws IOException {
        // 如果SD卡不存在或无法使用,则无法把异常信息写入SD卡
        if (!Environment.getExternalStorageState().equals(
                Environment.MEDIA_MOUNTED)) {
            if (DEBUG) {
                Log.w(TAG, "sdcard unmounted,skip dump exception");
                return null;
            }
        }
        File dir = new File(PATH);
        if (!dir.exists()) {
            dir.mkdirs();
        }
        long current = System.currentTimeMillis();
        String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
                .format(new Date(current));
        // File file = new File(PATH + FILE_NAME + time + "_"+ deviceToken +
        // FILE_NAME_SUFFIX);
        File file = new File(PATH + FILE_NAME + FILE_NAME_SUFFIX);
        if (!file.exists()) {
            file.createNewFile();
        } else {
            try {
                // 追加内容
                PrintWriter pw = new PrintWriter(new BufferedWriter(
                        new FileWriter(file, true)));
                pw.println(time);
                dumpPhoneInfo(pw);
                pw.println();
                ex.printStackTrace(pw);
                pw.println("---------------------------------分割线----------------------------------");
                pw.println();
                pw.close();
            } catch (Exception e) {
                Log.e(TAG, "dump crash info failed");
            }
        }
        return file;
    }
    private void dumpPhoneInfo(PrintWriter pw) throws NameNotFoundException {
        PackageManager pm = mContext.getPackageManager();
        PackageInfo pi = pm.getPackageInfo(mContext.getPackageName(),
                PackageManager.GET_ACTIVITIES);
        pw.print("App Version: ");
        pw.print(pi.versionName);
        pw.print('_');
        pw.println(pi.versionCode);
        // android版本号
        pw.print("OS Version: ");
        pw.print(Build.VERSION.RELEASE);
        pw.print("_");
        pw.println(Build.VERSION.SDK_INT);
        // 手机制造商
        pw.print("Vendor: ");
        pw.println(Build.MANUFACTURER);
        // 手机型号
        pw.print("Model: ");
        pw.println(Build.MODEL);
        // cpu架构
        pw.print("CPU ABI: ");
        pw.println(Build.CPU_ABI);
    }
    /**
     * 提供方法上传异常信息到服务器
     * @param log
     */
    private void uploadExceptionToServer(File log) {
        // TODO Upload Exception Message To Your Web Server
    }
}

上面是核心代码,可以直接拿去用,可以在Application类中进行初始化。

以上就是小编今天的分享了,希望可以帮助到大家。

显示全文
java获取网络时间 java crontab java获取视频时长 java csrf java获取请求域名 java获取路径 java cssbox java获取运行时间 java ctp java获取随机字符串 java daemon java获取随机数 java dashboard java获得当前路径 java表单校验 java dataframe java规则引擎 java dataset java读取json java读取本地excel java获取秒级时间戳 java core java获取泛型class java corba java cookie java获取本地ip java controller java获取本周日期 java context japanese java 微信怎么群发消息 java获取时间差 java获取文件名后缀 微博账号怎么注销 excel如何换行 java获取当月最后一天日期 excel去重 java获取当前项目的路径 QQ怎么强制解绑手机号 java获取当前路径的几种方法