Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
Androidƽ̨µÄ±ÀÀ£²¶»ñ»úÖÆ¼°ÊµÏÖ
 
×÷ÕߣºÌÆÐ¡Òý À´Ô´£ºCSDN ·¢²¼ÓÚ£º 2016-1-15
  5637  次浏览      27
 

×÷Õß¼ò½é£º¼ÖÖ¾¿­£¬Testin±ÀÀ£·ÖÎöÏîÄ¿Ñз¢¹¤³Ìʦ£¬¸ºÔð¿Í»§¶ËSDKÏà¹Ø¼¼ÊõÑз¢¹¤×÷¡£5ÄêÒÆ¶¯»¥ÁªÍø¿ª·¢¾­Ñé£¬ÔøÈÎÖ°ÓÚÖпÆÔº¡¢Symantec¡¢Opera£¬¶ÔÒÆ¶¯AppµÄ²âÊÔ¡¢·ÖÎöÓнÏÉîÈëµÄÑо¿¡£

AndroidϵͳË鯬»¯Ôì³ÉÓ¦ÓóÌÐò±ÀÀ£ÑÏÖØ£¬ÔÚÄ£ÄâÆ÷ÉÏÔËÐÐÁ¼ºÃµÄ³ÌÐò°²×°µ½Ä³¿îÊÖ»úÉÏ˵²»¶¨¾Í»á³öÏÖ±ÀÀ£µÄÏÖÏó¡£¶øÇÒ£¬ÍùÍù¶¼ÊdzÌÐò·¢²¼Ö®ºóÔÚÓû§¶Ë³öÏÖÁ˱ÀÀ£ÏÖÏó¡£ËùÒÔ£¬ÈçºÎ¼°Ê±²¶»ñ²¢ÊÕ¼¯Androidƽ̨µÄ±ÀÀ£¾ÍÏÔµÃÓú·¢ÖØÒª¡£Ä¿Ç°£¬ÊÐÃæÉÏÒѾ­ÓеÚÈý·½SDK¿ÉÒÔ°ïÖú¿ª·¢ÕßÍê³ÉÕâÒ»¹¦ÄÜ£¬±¾ÎĽ«¸ú´ó¼Ò·ÖÏíÒ»ÏÂÕâЩ±ÀÀ£·ÖÎöSDKµÄʵÏÖÔ­Àí¡£

³£¼ûµÄAndroid±ÀÀ£ÓÐÁ½À࣬һÀàÊÇJava ExceptionÒì³££¬Ò»ÀàÊÇNative SignalÒì³£¡£ÎÒÃǽ«Î§ÈÆÕâÁ½ÀàÒì³£½øÐС£¶ÔÓںܶà»ùÓÚUnity¡¢Cocosƽ̨µÄÓÎÏ·£¬»¹»áÓÐC#¡¢JavaScript¡¢LuaµÈµÄÒì³££¬ÕâÀï²»×öÌÖÂÛ¡£

Java´úÂëµÄ±ÀÀ£»úÖÆ¼°ÊµÏÖ

AndroidÓ¦ÓóÌÐòµÄ¿ª·¢ÊÇ»ùÓÚJavaÓïÑԵģ¬ËùÒÔÊ×ÏÈÀ´·ÖÎöµÚÒ»ÀàAndroid±ÀÀ£Java Exception¡£

ExceptionµÄ·ÖÀ༰²¶»ñ

JavaµÄÒì³£¿ÉÒÔ·ÖΪÁ½ÀࣺChecked ExceptionºÍUnChecked Exception¡£ËùÓÐRuntimeExceptionÀ༰Æä×ÓÀàµÄʵÀý±»³ÆÎªRunt imeÒì³££¬¼´UnChecked Exception£¬²»ÊÇRuntimeExceptionÀ༰Æä×ÓÀàµÄÒ쳣ʵÀýÔò±»³ÆÎªChecked Exception¡£

CheckedÒì³£ÓÖ³ÆÎª±àÒëʱÒì³££¬¼´ÔÚ±àÒë½×¶Î±»´¦ÀíµÄÒì³£¡£±àÒëÆ÷»áÇ¿ÖÆ³ÌÐò´¦ÀíËùÓеÄCheckedÒì³££¬Ò²¾ÍÊÇÓÃtry¡­catchÏÔʽµÄ²¶»ñ²¢´¦Àí£¬ÒòΪJavaÈÏΪÕâÀàÒì³£¶¼ÊÇ¿ÉÒÔ±»´¦Àí£¨ÐÞ¸´£©µÄ¡£ÔÚJava APIÎĵµÖУ¬·½·¨ËµÃ÷ʱ£¬¶¼»áÌí¼ÓÊÇ·ñthrowij¸öexception£¬Õâ¸öexception¾ÍÊÇCheckedÒì³£¡£Èç¹ûûÓÐtry¡­catchÕâ¸öÒì³££¬Ôò±àÒë³ö´í£¬´íÎóÌáʾÀàËÆÓÚ¡°Unhandled?exception type xxxxx¡±¡£

¸ÃÀàÒì³£²¶»ñµÄÁ÷³ÌÊÇ£º

  • Ö´ÐÐtry¿éÖеĴúÂë³öÏÖÒì³££¬ÏµÍ³»á×Ô¶¯Éú³ÉÒ»¸öÒì³£¶ÔÏ󣬲¢½«¸ÃÒì³£¶ÔÏóÌá½»¸øJavaÔËÐл·¾³£¬Õâ¸ö¾ÍÊÇÒì³£Å׳ö£¨throw£©½×¶Î£»
  • µ±JavaÔËÐл·¾³ÊÕµ½Òì³£¶ÔÏóʱ£¬»áѰÕÒ×î½üµÄÄܹ»´¦Àí¸ÃÒì³£¶ÔÏóµÄcatch¿é£¬ÕÒµ½Ö®ºó°Ñ¸ÃÒì³£¶ÔÏ󽻸øcatch¿é´¦Àí£¬Õâ¸ö¾ÍÊÇÒì³£²¶»ñ£¨catch£©½×¶Î¡£

CheckedÒì³£Ò»°ãÊDz»ÒýÆðAndroid App CrashµÄ£¬×¢ÒâÊÇ¡°Ò»°ã¡±£¬ÕâÀïÖ®ËùÒÔ½éÉÜ£¬ÓÐÁ½¸öÔ­Òò£º

  • ÐγÉϵͳµÄÁ˽⣬¸üºÃµØ¶Ô±ÈÀí½âUnCheckedException£»
  • ¶ÔÓÚһЩChecked Exception£¬ËäÈ»ÎÒÃÇÔÚ³ÌÐòÀïÃæÒѾ­²¶»ñ²¢´¦ÀíÁË£¬µ«ÊÇÈç¹ûÄÜͬʱ½«¸ÃÒì³£ÊÕ¼¯²¢·¢Ë͵½ºǫ́£¬½«ÓÐÖúÓÚÌáÉýAppµÄ½¡×³ÐÔ¡£±ÈÈçÐ޸ĴúÂëÂß¼­»Ø±Ü¸ÃÒì³££¬»òÕß²¶»ñºó²ÉÓøüºÃµÄ·½·¨È¥´¦Àí¸ÃÒì³£¡£ÖÁÓÚÓ¦¸ÃÊÕ¼¯ÄÄЩChecked Exception£¬ÔòÈ¡¾öÓÚAppµÄÒµÎñÂß¼­ºÍ¿ª·¢Õߵľ­ÑéÁË¡£

UnCheckedÒì³£ÓÖ³ÆÎªÔËÐÐʱÒì³££¬¼´Runtime-Exception£¬×î³£¼ûµÄιýÓÚNullPointerException¡£UnCheckedÒì³£·¢Éúʱ£¬ÓÉÓÚûÓÐÏàÓ¦µÄtry¡­catch´¦Àí¸ÃÒì³£¶ÔÏó£¬ËùÒÔJavaÔËÐл·¾³½«»áÖÕÖ¹£¬³ÌÐò½«Í˳ö£¬Ò²¾ÍÊÇÎÒÃÇËù˵µÄCrash¡£µ±È»£¬Äã¿ÉÄÜ»á˵£¬ÄÇÎÒÃǰÑÕâЩÒì³£Ò²try¡­catchס²»¾ÍÐÐÁË¡£ÀíÂÛÉÏȷʵÊÇ¿ÉÒԵ쬵«ÓÐÁ½µã»áµ¼ÖÂÕâÖÖ·½°¸²»¿ÉÐУº

  • ÎÞ·¨½«ËùÓеĴúÂë¶¼¼ÓÉÏtry¡­catch£¬ÕâÑù¶Ô´úÂëµÄЧÂʺͿɶÁÐÔ½«ÊÇ»ÙÃðÐԵģ»
  • UnCheckedÒ쳣ͨ³£¶¼ÊǽÏΪÑÏÖØµÄÒì³££¬»òÕß˵ÒѾ­ÆÆ»µÁËÔËÐл·¾³µÄ¡£±ÈÈçÄÚ´æµØÖ·£¬¼´Ê¹ÎÒÃÇtry¡­catchסÁË£¬Ò²²»ÄÜÃ÷È·ÖªµÀÈçºÎ´¦Àí¸ÃÒì³££¬²ÅÄܱ£Ö¤³ÌÐò½ÓÏÂÀ´µÄÔËÐÐÊÇÕýÈ·µÄ¡£

ûÓÐtry¡­catchסµÄÒì³££¬¼´UncaughtÒì³££¬¶¼»áµ¼ÖÂÓ¦ÓóÌÐò±ÀÀ£¡£ÄÇ̫̾¶Ô±ÀÀ££¬ÎÒÃÇÊÇ·ñ¿ÉÒÔ×öÐ©Ê²Ã´ÄØ£¿±ÈÈç³ÌÐòÍ˳öǰ£¬µ¯³ö¸öÐÔ»¯¶Ô»°¿ò£¬¶ø²»ÊÇĬÈϵÄÇ¿ÖÆ¹Ø±Õ¶Ô»°¿ò£¬»òÕßµ¯³öÒ»¸öÌáʾ¿ò°²Î¿Ò»ÏÂÓû§£¬ÉõÖÁÖØÆôÓ¦ÓóÌÐòµÈ¡£

ÆäʵJavaÌṩÁËÒ»¸ö½Ó¿Ú¸øÎÒÃÇ£¬¿ÉÒÔÍê³ÉÕâЩ£¬Õâ¾ÍÊÇUncaughtExceptionHandler£¬¸Ã½Ó¿Úº¬ÓÐÒ»¸ö´¿Ð麯Êý£ºpublic abstract void uncaughtException (Thread thread, Throwableex)¡£

UncaughtÒì³£·¢Éúʱ»áÖÕÖ¹Ị̈߳¬´Ëʱ£¬ÏµÍ³±ã»á֪ͨUncaughtExceptionHandler£¬¸æËßËü±»ÖÕÖ¹µÄÏß³ÌÒÔ¼°¶ÔÓ¦µÄÒì³££¬È»ºó±ã»áµ÷ÓÃuncaughtExceptionº¯Êý¡£Èç¹û¸ÃhandlerûÓб»ÏÔʽÉèÖã¬Ôò»áµ÷ÓöÔÓ¦Ïß³Ì×éµÄĬÈÏhandler¡£Èç¹ûÎÒÃÇÒª²¶»ñ¸ÃÒì³££¬±ØÐëʵÏÖÎÒÃÇ×Ô¼ºµÄhandler£¬²¢Í¨¹ýÒÔϺ¯Êý½øÐÐÉèÖãº

public static void setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler handler)

ʵÏÖ×Ô¶¨ÒåµÄhandler£¬Ö»ÐèÒª¼Ì³ÐUncaughtExceptionHandler¸Ã½Ó¿Ú£¬²¢ÊµÏÖuncaughtException·½·¨¼´¿É¡£

static class MyCrashHandler implements UncaughtExceptionHandler{  
@Override
public void uncaughtException(Thread thread, final Throwable throwable) {
// Deal this exception
}
}

ÔÚÈκÎÏß³ÌÖУ¬¶¼¿ÉÒÔͨ¹ýsetDefaultUncaughtExceptionHandlerÀ´ÉèÖÃhandler£¬µ«ÔÚAndroidÓ¦ÓóÌÐòÖУ¬È«¾ÖµÄApplicationºÍActivity¡¢Service¶¼Í¬ÊôÓÚUIÖ÷Ị̈߳¬Ïß³ÌÃû³ÆÄ¬ÈÏΪ¡°main¡±¡£ËùÒÔ£¬ÔÚApplicationÖÐÓ¦¸ÃΪUIÖ÷Ïß³ÌÌí¼ÓUncaughtExceptionHandler£¬ÕâÑùÕû¸ö³ÌÐòÖеÄActivity¡¢ServiceÖгöÏÖµÄUncaughtExceptionʼþ¶¼¿ÉÒÔ±»´¦Àí¡£

Èç¹û¶à´Îµ÷ÓÃsetDefaultUncaughtExceptionHandlerÉèÖÃhandler£¬ÒÔ×îºóÒ»´ÎΪ׼¡£ÕâÒ²¾ÍÊÇΪʲô¶à¸ö×¥±ÀÀ£µÄSDKͬʱʹÓã¬×Ü»áÓÐһЩSDK¹¤×÷²»Õý³£¡£Ä³Ð©Çé¿öÏ£¬Óû§»á¼ÈÏëÀûÓõÚÈý·½SDKÊÕ¼¯±ÀÀ££¬ÓÖÏë¸ù¾Ý±ÀÀ£ÀàÐÍ×ö³öÒµÎñÏà¹ØµÄ´¦Àí¡£´ËʱÓÐÁ½ÖÖ·½°¸£º

  • SDKÌṩÁËÒ»¸ö½Ó¿Ú£¬ÔÊÐíÓû§´«µÝ×Ô¼ºhandler¸øSDK¡£µ±Ö´ÐÐuncaughtExceptionµÄʱºò£¬SDKÖ»¸ºÔð²É¼¯±ÀÀ£ÐÅÏ¢£¬Ö®ºó±ãµ÷ÓÃÓû§µÄhandlerÀ´´¦Àí±ÀÀ£ÁË¡£Õâ¶ùÆäʵÀàËÆÓÚ¶àÁËÒ»²ãsetDefaultUncaughtExceptionHandler£¬Ö»ÊDz»Äܺͱê×¼¿âÓÃͬÑùµÄÃû³Æ£¬ÒòΪ»á¸²¸Ç¡£
  • Óû§ÏÈͨ¹ýsetDefaultUncaughtExceptionHandlerÉèÖÃ×Ô¼ºµÄhandler£¬È»ºóSDKÔÙ´Îͨ¹ýsetDefaultUncaughtExceptionHandlerÉè×Ôhandlerǰ£¬Ïȱ£´æÖ®Ç°µÄhandler£¬ÔÚSDK handlerÂß¼­´¦ÀíÍê³ÉÖ®ºó£¬ÔÙµ÷ÓÃ֮ǰµÄhandler´¦Àí¸ÃÒì³£¡£
static class MyCrashHandler implements UncaughtExceptionHandler {
private UncaughtExceptionHandler originalHandler;
private MyCrashHandler(Context context) {
originalHandler = Thread.getDefaultUncaughtExceptionHandler();
}
@Override
public void uncaughtException(Thread thread, final Throwable throwable) {
// Deal this exception
if (originalHandler != null) {
originalHandler.uncaughtException(thread, throwable);
}
}
}

»ñÈ¡Exception±ÀÀ£¶ÑÕ»

²¶»ñExceptionÖ®ºó£¬ÎÒÃÇ»¹ÐèÒªÖªµÀ±ÀÀ£¶ÑÕ»µÄÐÅÏ¢£¬ÕâÑùÓÐÖúÓÚÎÒÃÇ·ÖÎö±ÀÀ£µÄÔ­Òò£¬²éÕÒ´úÂëµÄBug¡£Òì³£¶ÔÏóµÄprintStackTrace·½·¨ÓÃÓÚ´òÓ¡Òì³£µÄ¶ÑÕ»ÐÅÏ¢£¬¸ù¾ÝprintStackTrace·½·¨µÄÊä³ö½á¹û£¬ÎÒÃÇ¿ÉÒÔÕÒµ½Òì³£µÄÔ´Í·£¬²¢¸ú×Ùµ½Ò쳣һ·´¥·¢µÄ¹ý³Ì¡£

public static String getStackTraceInfo(final Throwable throwable) {
String trace = "";
try {
Writer writer = new StringWriter();
PrintWriter pw = new PrintWriter(writer);
throwable.printStackTrace(pw);
trace = writer.toString();
pw.close();
} catch (Exception e) {
return "";
}
ret

Native´úÂëµÄ±ÀÀ£»úÖÆ¼°ÊµÏÖ

Androidƽ̨³ýÁËʹÓÃJavaÓïÑÔ¿ª·¢ÒÔÍ⣬»¹ÌṩÁ˶ÔC/C++µÄÖ§³Ö¡£¶ÔÓÚһЩ¸ßCPUÏûºÄµÄÓ¦ÓóÌÐò£¬JavaÓïÑÔºÜÄÑÂú×ã¶ÔÐÔÄܵÄÒªÇó£¬Õâʱ¾ÍÐèҪʹÓÃC/C++½øÐпª·¢£¬±ÈÈçÓÎÏ·ÒýÇæ¡¢ÐźŴ¦ÀíµÈ¡£µ«ÊÇNative´úÂëÖ»ÄÜ¿ª·¢¶¯Ì¬Á´½Ó¿â£¨so£©£¬È»ºóJavaͨ¹ýJNIÀ´µ÷ÓÃso¿â¡£

Native±ÀÀ£·ÖÎöÓë²¶»ñ

C++Ò²¿ÉÒÔͨ¹ýtry¡­catchÈ¥´¦ÀíһЩÒì³££¬µ«Èç¹û³öÏÖÁËUncaughtÒì³££¬so¿â¾Í»áÒýÆð±ÀÀ£¡£´Ëʱ¿Ï¶¨ÎÞ·¨Í¨¹ýJavaµÄUncaught-ExceptionHandlerÀ´´¦Àí£¬ÄÇôÎÒÃÇÓ¦¸ÃÈçºÎ²¶»ñNative´úÂëµÄ±ÀÀ£ÄØ£¿ÊìϤLinux¿ª·¢µÄÈ˶¼ÖªµÀ£¬so¿âÒ»°ãͨ¹ýgcc/g++±àÒ룬±ÀÀ£Ê±»á²úÉúÐźÅÒì³£¡£Androidµ×²ãÊÇLinuxϵͳ£¬ËùÒÔso¿â±ÀÀ£Ê±Ò²»á²úÉúÐźÅÒì³£¡£ÄÇôÈç¹ûÎÒÃÇÄܹ»²¶»ñÐźÅÒì³££¬¾ÍÏ൱ÓÚ²¶»ñÁËAndroid Native±ÀÀ£¡£

ÐÅºÅÆäʵÊÇÒ»ÖÖÈí¼þ²ãÃæµÄÖжϻúÖÆ£¬µ±³ÌÐò³öÏÖ´íÎ󣬱ÈÈç³ýÁã¡¢·Ç·¨ÄÚ´æ·ÃÎÊʱ£¬±ã»á²úÉúÐźÅʼþ¡£ÄÇô½ø³ÌÈçºÎ»ñÖª²¢ÏìÓ¦¸ÃʼþÄØ£¿LinuxµÄ½ø³ÌÊÇÓÉÄں˹ÜÀíµÄ£¬Äں˻á½ÓÊÕÐźţ¬²¢½«Æä·ÅÈëµ½ÏàÓ¦µÄ½ø³ÌÐźŶÓÁÐÀïÃæ¡£µ±½ø³ÌÓÉÓÚϵͳµ÷Óá¢ÖжϻòÒì³£¶ø½øÈëÄÚºË̬ÒԺ󣬴ÓÄÚºË̬»Øµ½Óû§Ì¬Ö®Ç°»á¼ì²âÐźŶÓÁУ¬²¢²éÕÒµ½ÏàÓ¦µÄÐźŴ¦Àíº¯Êý¡£Äں˻áΪ½ø³Ì·ÖÅäĬÈϵÄÐźŴ¦Àíº¯Êý£¬Èç¹ûÄãÏëÒª¶Ôij¸öÐźŽøÐÐÌØÊâ´¦Àí£¬ÔòÐèҪע²áÏàÓ¦µÄÐźŴ¦Àíº¯Êý£¨Èçͼ1Ëùʾ£©¡£


ͼ1 Ðźżì²âÓë´¦ÀíÁ÷³Ì£¨Ô­Í¼³ö×Ô¡¶LinuxÄÚºËÔ´´úÂëÇé¾°·ÖÎö¡·£©

½ø³Ì¶ÔÐźÅÒì³£µÄÏìÓ¦¿ÉÒÔ¹é½áΪÒÔϼ¸Àࣺ

  • ºöÂÔÐźţº¶ÔÐźŲ»×öÈκδ¦Àí£¬³ýÁËSIGKILL¼°SIGSTOPÒÔÍ⣨³¬¼¶Óû§É±µô½ø³Ìʱ²úÉú£©£¬ÆäËû¶¼¿ÉÒÔºöÂÔ£»
  • ²¶»ñÐźţº×¢²áÐźŴ¦Àíº¯Êý£¬µ±Ðźŷ¢Éúʱ£¬Ö´ÐÐÏàÓ¦µÄ´¦Àíº¯Êý£»
  • ĬÈÏ´¦Àí£ºÖ´ÐÐÄں˷ÖÅäµÄĬÈÏÐźŴ¦Àíº¯Êý£¬´ó¶àÊýÎÒÃÇÓöµ½µÄÐźÅÒì³££¬Ä¬ÈÏ´¦ÀíÊÇÖÕÖ¹³ÌÐò²¢Éú³ÉcoreÎļþ¡£

¶ÔNative´úÂëµÄ±ÀÀ££¬¿ÉÒÔͨ¹ýµ÷ÓÃsigaction()×¢²áÐźŴ¦Àíº¯ÊýÀ´Íê³É¡£

#include <signal.h> 
int sigaction(int signum,const struct sigaction *act,struct sigaction *oldact));
  • signum£º´ú±íÐźűàÂ룬¿ÉÒÔÊdzýSIGKILL¼°SIGSTOPÍâµÄÈκÎÒ»¸öÌØ¶¨ÓÐЧµÄÐźţ¬Èç¹ûΪÕâÁ½¸öÐźŶ¨Òå×Ô¼ºµÄ´¦Àíº¯Êý£¬½«µ¼ÖÂÐźŰ²×°´íÎó¡£
  • act£ºÖ¸Ïò½á¹¹ÌåsigactionµÄÒ»¸öʵÀýµÄÖ¸Õ룬¸ÃʵÀýÖ¸¶¨Á˶ÔÌØ¶¨ÐźŵĴ¦Àí£¬Èç¹ûÉèÖÃΪ¿Õ£¬½ø³Ì»áÖ´ÐÐĬÈÏ´¦Àí¡£
  • oldact£ººÍ²ÎÊýactÀàËÆ£¬Ö»²»¹ý±£´æµÄÊÇÔ­À´¶ÔÏàÓ¦ÐźŵĴ¦Àí£¬Ò²¿ÉÉèÖÃΪNULL¡£

sigactionº¯ÊýÓÃÓÚ¸Ä±ä½ø³Ì½ÓÊÕµ½Ìض¨ÐźźóµÄÐÐΪ¡£Èç¹û°ÑµÚ¶þ¡¢µÚÈý¸ö²ÎÊý¶¼ÉèΪNULL£¬ÄÇô¸Ãº¯Êý¿ÉÓÃÓÚ¼ì²éÐźŵÄÓÐЧÐÔ¡£

½á¹¹Ìåsigaction°üº¬Á˶ÔÌØ¶¨ÐźŵĴ¦Àí¡¢ÐźÅËù´«µÝµÄÐÅÏ¢¡¢ÐźŴ¦Àíº¯ÊýÖ´Ðйý³ÌÖÐÓ¦ÆÁ±ÎµôÄÄЩº¯ÊýµÈµÈ¡£

struct sigaction {
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
}

ÔÚһЩÌåϵÉÏ£¬sa_handlerºÍsa_sigaction¹²ÓÃÒ»¸öÁªºÏÌ壨union£©£¬ËùÒÔ²»ÒªÍ¬Ê±Ö¸¶¨Á½¸ö×ֶεÄÖµ¡£

  • sa_handler£º Ö¸¶¨¶ÔsignumÐźŵĴ¦Àíº¯Êý£¬¿ÉÒÔÊÇSIG_DFLĬÈÏÐÐΪ£¬SIG_IGNºöÂÔ½ÓË͵½µÄÐźţ¬»òÕßÒ»¸öÐźŴ¦Àíº¯ÊýÖ¸Õë¡£Õâ¸öº¯ÊýÖ»ÓÐÐźűàÂëÒ»¸ö²ÎÊý¡£
  • sa_sigaction£º µ±sa_flagsÖдæÔÚSA_SIGINFO±ê־ʱ£¬sa_sigaction½«×÷ΪsignumÐźŵĴ¦Àíº¯Êý¡£
  • sa_mask£ºÖ¸¶¨ÐźŴ¦Àíº¯ÊýÖ´ÐеĹý³ÌÖÐÓ¦±»×èÈûµÄÐźš£
  • sa_flags£ºÖ¸¶¨Ò»ÏµÁÐÓÃÓÚÐÞ¸ÄÐźŴ¦Àí¹ý³ÌÐÐΪµÄ±êÖ¾£¬ÓÉ0¸ö»ò¶à¸ö±ê־ͨ¹ýorÔËËã×éºÏ¶ø³É£¬±ÈÈçSA_RESETHAND£¬SA_ONSTACK | SA_SIGINFO¡£
  • sa_restorer£º ÒѾ­·ÏÆú£¬²»ÔÙʹÓá£

¸÷²ÎÊýµÄÏêϸʹÓÃ˵Ã÷£¬Çë²Î¿¼Ïà¹Ø×ÊÁÏ¡£

»ùÓÚÉÏÃæµÄ·ÖÎö£¬ÏÂÃæ¸ø³öNative´úÂë±ÀÀ££¨¼´ÐźÅÒì³££©²¶»ñµÄ´úÂëÆ¬¶Î£¬Èôó¼ÒÓÐÒ»¸ö¸üÖ±¹ÛµÄÈÏʶ¡£

const int handledSignals[] = {
SIGSEGV, SIGABRT, SIGFPE, SIGILL, SIGBUS
};
const int handledSignalsNum = sizeof(handledSignals) / sizeof(handledSignals[0]);
struct sigaction old_handlers[handledSignalsNum];

int nativeCrashHandler_onLoad(JNIEnv *env) {
struct sigaction handler;
memset(&handler, 0, sizeof(sigaction));
handler.sa_sigaction = my_sigaction;
handler.sa_flags = SA_RESETHAND;

for (int i = 0; i < handledSignalsNum; ++i) {
sigaction(handledSignals[i], &handler, &old_handlers[i]);
}

return 1;
}

µ±AndroidÓ¦ÓóÌÐò¼ÓÔØso¿âµÄʱºò£¬µ÷ÓÃnativeCrashHandler_onLoad»áΪSIGSEGV¡¢SIGABRT¡¢SIGFPE¡¢SIGILL¡¢SIGBUSͨ¹ýsigaction×¢²áÐźŴ¦Àíº¯Êýmy_sigaction¡£µ±·¢ÉúNative±ÀÀ£²¢ÇÒ·¢ÉúÇ°Ãæ¼¸¸öÐźÅÒ쳣ʱ£¬¾Í»áµ÷ÓÃmy_sigactionÍê³ÉÐźŴ¦Àí¡£

notifyNativeCrash  = (*env)->GetMethodID(env, cls,  "notifyNativeCrash", "()V");
void my_sigaction(int signal, siginfo_t *info, void *reserved) {
// Here catch the native crash
}

»ñÈ¡Native±ÀÀ£¶ÑÕ»

AndroidûÓÐÌṩÏñthrowable.printStackTraceÒ»ÑùµÄ½Ó¿ÚÈ¥»ñÈ¡Native±ÀÀ£ºó¶ÑÕ»ÐÅÏ¢£¬ËùÒÔÎÒÃÇÐèÒª×Ô¼ºÏë°ì·¨ÊµÏÖ¡£ÕâÀïÓÐÁ½ÖÖ˼·¿ÉÒÔ¿¼ÂÇ¡£

  • ÀûÓÃLogCatÈÕÖ¾

ÔÚ±¾µØµ÷ÊÔ´úÂëʱ£¬ÎÒÃǾ­³£Í¨¹ý²é¿´LogCatÈÕÖ¾À´·ÖÎö½â¾öÎÊÌâ¡£¶ÔÓÚ·¢²¼µÄÓ¦Óã¬ÔÚ´úÂëÖÐÖ´ÐÐÃüÁî¡°logcat -d -v threadtime¡±Ò²ÄܴﵽͬÑùµÄЧ¹û£¬Ö»²»¹ýÊÇ»ñÈ¡µ½ÁËÓû§ÊÖ»úµÄlogcat¡£µ±Native±ÀÀ£Ê±£¬AndroidϵͳͬÑù»áÊä³ö±ÀÀ£¶ÑÕ»µ½LogCat£¬ÄÇôÄõ½ÁËLogCatÐÅÏ¢Ò²¾ÍÄõ½ÁËNativeµÄ±ÀÀ£¶ÑÕ»¡£

Process process = Runtime.getRuntime().exec(new String[]{"logcat","-d","-v","threadtime"});
String logTxt = getSysLogInfo(process.getInputStream());

ÔÚmy_sigaction²¶»ñµ½Òì³£Ðźźó£¬Í¨ÖªJava²ã´úÂ룬ÔÚJava²ãÆô¶¯ÐµĽø³Ì£¬²¢ÔÚеĽø³ÌÖÐÍê³ÉÉÏÃæµÄ²Ù×÷¡£ÕâÀï×¢ÒâÒ»¶¨ÒªÔÚеĽø³ÌÖÐÍê³É£¬ÒòΪԭÓеĽø³ÌÂíÉϾͻá½áÊø¡£

ÍøÂçÉÏÓÐһЩ¶ÔÓ¦ÕâÖÖ˼·µÄ´úÂ룬µ«ÊÇÔںܶàÊÖ»úÉ϶¼ÎÞ·¨»ñµÃNativeµÄ±ÀÀ£¶ÑÕ»¡£Ô­ÒòÊǶԱÀÀ£¶ÑÕ»²úÉúÁËÆÆ»µ£¬Ê¹µÃÏà¹ØÐÅÏ¢²¢Ã»ÓÐÊä³öµ½logcatÖС£Ñо¿Ò»ÏÂAndroid backtraceµÄµ×²ãʵÏÖÒÔ¼°Google BreakpadµÄÔ´Â룬»á°ïÖúÄã½â¾öÕâ¸öÎÊÌâ¡£

  • Google Breakpad

LinuxÌṩÁËCore Dump»úÖÆ£¬¼´²Ù×÷ϵͳ»á°Ñ³ÌÐò±ÀÀ£Ê±µÄÄÚ´æÄÚÈÝdump³öÀ´£¬Ð´ÈëÒ»¸ö½Ð×öcoreµÄÎļþÀïÃæ¡£Google Breakpad×÷Ϊ¿çƽ̨µÄ±ÀÀ£×ª´¢ºÍ·ÖÎöÄ£¿é£¨Ö§³ÖWindows¡¢OS X¡¢Linux¡¢iOSºÍAndroidµÈ£©£¬±ãÊÇͨ¹ýÀàËÆµÄMiniDump»úÖÆÀ´»ñÈ¡±ÀÀ£¶ÑÕ»µÄ¡£

ͨ¹ýGoogle Breakpad²¶»ñÐźÅÒì³££¬²¢½«¶ÑÕ»ÐÅϢдÈëÄãÖ¸¶¨µÄ±¾µØMiniDumpÎļþÖС£ÏÂ´ÎÆô¶¯Ó¦ÓóÌÐòµÄʱºò£¬±ã¿ÉÒÔ¶ÁÈ¡¸ÃMiniDumpÎļþ½øÐÐÏàÓ¦µÄ²Ù×÷£¬±ÈÈçÉÏ´«µ½ºǫ́·þÎñÆ÷¡£µ±È»£¬Ò²¿ÉÒÔÐÞ¸ÄGoogle BreakpadµÄÔ´Â룬²»Ð´MiniDumpÎļþ£¬¶øÊÇͨ¹ýdumpCallbackÖ±½Ó»ñµÃ¶ÑÕ»ÐÅÏ¢£¬²¢½«Ïà¹ØÐÅϢ֪ͨµ½Java²ã´úÂ룬×öÏàÓ¦µÄ´¦Àí¡£

Google BreakpadÊÇȨÍþµÄ²¶»ñNative±ÀÀ£µÄ·½·¨£¬Ïà¹ØµÄʹÓ÷½·¨¿ÉÒԲ鿴¹ÙÍøÎĵµ¡£ÓÉÓÚËü¿çƽ̨£¬´úÂëÌåÁ¿½Ï´ó£¬ËùÒÔ½¨Òé´ó¼Ò²Ã¼ôÔ´Â룬ֻ±£ÁôAndroidÏà¹ØµÄ¹¦ÄÜ£¬±£³Ö×Ô¼ºAPKµÄСÇÉ¡£

 

   
5637 ´Îä¯ÀÀ       27
 
Ïà¹ØÎÄÕÂ

ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖÓë̽ÌÖ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
 
Ïà¹ØÎĵµ

Android_UI¹Ù·½Éè¼Æ½Ì³Ì
ÊÖ»ú¿ª·¢Æ½Ì¨½éÉÜ
androidÅÄÕÕ¼°ÉÏ´«¹¦ÄÜ
Android½²ÒåÖÇÄÜÊÖ»ú¿ª·¢
Ïà¹Ø¿Î³Ì

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
Androidϵͳ¿ª·¢
AndroidÓ¦Óÿª·¢
ÊÖ»úÈí¼þ²âÊÔ
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

androidÈË»ú½çÃæÖ¸ÄÏ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
AndroidÊÖ»ú¿ª·¢£¨¶þ£©
AndroidÊÖ»ú¿ª·¢£¨Èý£©
AndroidÊÖ»ú¿ª·¢£¨ËÄ£©
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖ̽ÌÖ
ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
ÊÖ»úÈí¼þ×Ô¶¯»¯²âÊÔÑо¿±¨¸æ


Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
AndroidÓ¦Óÿª·¢
Androidϵͳ¿ª·¢
ÊÖ»úÈí¼þ²âÊÔ
ǶÈëʽÈí¼þ²âÊÔ
AndroidÈí¡¢Ó²¡¢ÔÆÕûºÏ


ÁìÏÈIT¹«Ë¾ android¿ª·¢Æ½Ì¨×î¼Ñʵ¼ù
±±¾© Android¿ª·¢¼¼Êõ½ø½×
ijÐÂÄÜÔ´ÁìÓòÆóÒµ Android¿ª·¢¼¼Êõ
ijº½Ì칫˾ Android¡¢IOSÓ¦ÓÃÈí¼þ¿ª·¢
°¢¶û¿¨ÌØ LinuxÄÚºËÇý¶¯
°¬Ä¬Éú ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
Î÷ÃÅ×Ó Ç¶Èëʽ¼Ü¹¹Éè¼Æ