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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
AndroidÔ¶³Ìµ÷ÊÔµÄ̽Ë÷ÓëʵÏÖ
 
À´Ô´:À´×ÔÍøÂç ·¢²¼ÓÚ2017-7-28
  2812  次浏览      27
 

×÷ÎªÒÆ¶¯¿ª·¢Õߣ¬×îÍ·ÌÛµÄιýÓÚÓöµ½²úÆ·ÉÏÏßÒÔºó³öÏÖÁËbug£¬µ«ÊDZ¾µØ¿ª·¢»·¾³ÓÖÎÞ·¨¸´ÏÖµÄÇé¿ö¡£³£¼ûµÄµ÷²éÏßÉϼ¬ÊÖÎÊÌⷽʽ´ó¸ÅÈçÏ£º

ÒÔÉÏÁ½ÖÖ·½·¨ÔÚ֮ǰµ÷²éÏßÉÏÎÊÌâʱ¶¼ÓÐʹÓ㬵«ÒòΪ¶þÕß¶¼ÓÐÃ÷ÏÔµÄȱµã£¬ËùÒÔЧ¹û²»ÊÇÌØ±ðÀíÏë¡£

ÄÜ·ñ¿ª·¢Ò»ÖÖ¹¤¾ß£¬¼È²»ÐèÒªÓû§Éî¶ÈÅäºÏÒ²²»ÐèÒªÌáǰÂñµã¾ÍÄÜ·½±ã¡¢¿ìËٵض¨Î»ÏßÉÏÎÊÌ⣿

×÷Ϊ³ÌÐòÔ±£¬²ébugÒ»°ãʹÓÃÏÂÃæ¼¸ÖÖ·½Ê½£ºÔĶÁÔ´Âë¡¢¼Ç¼ÈÕÖ¾»òµ÷ÊÔ³ÌÐò¡£Ò»°ã±¾µØÎÞ·¨¸´ÏÖµÄÎÊÌâͨ¹ýÔĶÁÔ´ÂëºÜÄÑÕÒµ½Ô­Òò£¬¶øÇÒ´ó¶àÊýÇé¿ö¶¼ºÍÓû§±¾µØ»·¾³Óйء£¼Ç¼ÈÕÖ¾µÄȱµã֮ǰ½²¹ýÁË£¬Í¬Ñù²»Ó迼ÂÇ£¬ÄÇÄÜ·ñÏñµ÷ÊÔ±¾µØ³ÌÐòÒ»Ñùµ÷ÊÔÒѾ­·¢²¼³öÈ¥µÄ³ÌÐòÄØ£¿ÎÒÃǶԴË×öÁËһЩ³¢ÊÔºÍ̽Ë÷¡£

µ÷ÊÔÔ­Àí

ÏÈ¿´Ïµ÷ÊÔÔ­Àí£¬ÕâÀïÒÔJavaΪÀý£¨Í¨¹ýIDEµ÷ÊÔAndroid³ÌÐòÒ²»ùÓÚ´ËÔ­Àí£©¡£Java£¨Android£©³ÌÐò¶¼ÊÇÔËÐÐÔÚJava£¨Dalvik\ART£©ÐéÄâ»úÉϵģ¬Òªµ÷ÊÔJava³ÌÐò£¬¾ÍÐèÒªÏòJavaÐéÄâ»úÇëÇóµ±Ç°³ÌÐòÔËÐÐ״̬£¬²¢¶ÔÐéÄâ»ú·¢ËÍÒ»¶¨µÄÖ¸ÁÉèÖÃһЩ»Øµ÷µÈµÈ¡£JavaµÄµ÷ÊÔÌåϵ£¬¾ÍÊÇÐéÄâ»úµÄÒ»Ì×ÓÃÓÚµ÷ÊԵŤ¾ßºÍ½Ó¿Ú¡£Java SE´Ó1.2.2°æ±¾ÒÔºóÍÆ³öÁËJPDA¿ò¼Ü£¨Java Platform Debugger Architecture£¬Javaƽ̨µ÷ÊÔÌåϵ½á¹¹£©¡£

JPDA¿ò¼Ü

JPDA¶¨ÒåÁËÒ»Ì×¶ÀÁ¢ÇÒÍêÕûµÄµ÷ÊÔÌåϵ£¬ËüÓÉÈý¸öÏà¶Ô¶ÀÁ¢µÄÄ£¿é×é³É£¬·Ö±ðΪ£º

1.JVM TI£ºJavaÐéÄâ»ú¹¤¾ß½Ó¿Ú£¨±»µ÷ÊÔÕߣ©¡£

2.JDWP£ºJava Debug Wire Protocol£¬Javaµ÷ÊÔЭÒ飨ͨµÀ£©¡£

3.JDI£ºJava Debug Interface£¬Javaµ÷ÊÔ½Ó¿Ú£¨µ÷ÊÔÕߣ©¡£

ÕâÈý¸öÄ£¿é°Ñµ÷ÊÔ¹ý³Ì·Ö½â³ÉÁËÈý¸ö×ÔÈ»µÄ¸ÅÄ

1.±»µ÷ÊÔÕßÔËÐÐÔÚÎÒÃÇÏëÒªµ÷ÊÔµÄÐéÄâ»úÉÏ£¬Ëü¿ÉÒÔͨ¹ýJVM TIÕâ¸ö±ê×¼½Ó¿Ú¼à¿Øµ±Ç°ÐéÄâ»úµÄÐÅÏ¢¡£

2.µ÷ÊÔÕß¶¨ÒåÁËÓû§¿ÉÒÔʹÓõĵ÷ÊÔ½Ó¿Ú£¬Óû§¿ÉÒÔͨ¹ýÕâЩ½Ó¿Ú¶Ô±»µ÷ÊÔÐéÄâ»ú·¢Ë͵÷ÊÔÃüÁͬʱÏÔʾµ÷ÊÔ½á¹û¡£

3.ÔÚµ÷ÊÔÕߺͱ»µ÷ÊÔÕßÖ®¼ä£¬Í¨¹ýJDWP´«Êä²ã´«ÊäÏûÏ¢¡£

Õû¸ö¹ý³ÌÈçÏ£º

Components Debugger Interfaces

/ |--------------|
/ | VM |
debuggee ----( |--------------| <------- JVM TI - Java VM Tool Interface
\ | back-end |
\ |--------------|
/ |
comm channel -( | <--------------- JDWP - Java Debug Wire Protocol
\ |
|--------------|
| front-end |
|--------------| <------- JDI - Java Debug Interface
| UI |
|--------------|

ÏÂÃæÖØµã½éÉÜÒ»ÏÂJDWPЭÒé¡£

JDWPЭÒé

JDWPЭÒéÊÇÓÃÓÚµ÷ÊÔÆ÷ÓëÄ¿±êÐéÄâ»úÖ®¼ä½øÐе÷ÊÔ½»»¥µÄͨÐÅЭÒ飬ËüµÄͨÐŻỰÖ÷Òª°üº¬Á½ÀàÊý¾Ý°ü£º

1.Command Packet£ºÃüÁî°ü¡£µ÷ÊÔÆ÷·¢Ë͸øÐéÄâ»úCommand£¬ÓÃÓÚ»ñÈ¡³ÌÐò״̬»ò¿ØÖƳÌÐòÖ´ÐУ»ÐéÄâ»ú·¢ËÍCommand¸øµ÷ÊÔÆ÷£¬ÓÃÓÚ֪ͨʼþ´¥·¢ÏûÏ¢¡£

2.Reply Packet£º»Ø¸´°ü£¬ÐéÄâ»ú·¢Ë͸øµ÷ÊÔÕ߻ظ´ÃüÁîµÄÇëÇó»òÕßÖ´Ðнá¹û¡£

JDWPµÄÊý¾Ý°üÖ÷Òª°üº¬°üÍ·ºÍÊý¾ÝÁ½²¿·Ö£¬°üÍ·×ֶκ¬ÒåÈçÏ£º

Êý¾Ý°ü²¿·ÖJDWPЭÒé°´ÕÕ¹¦ÄÜ·ÖΪ18×éÃüÁÒÔJava 7ΪÀý£©£¬°üº¬ÁËÐéÄâ»ú¡¢ÒýÓÃÀàÐÍ¡¢¶ÔÏó¡¢Ï̡߳¢·½·¨¡¢¶ÑÕ»¡¢Ê¼þµÈ²»Í¬ÀàÐ͵IJÙ×÷ÃüÁî¡£

DalvikÐéÄâ»ú/ARTÐéÄâ»ú¶ÔJDWPЭÒéµÄÖ§³Ö²¢²»ÍêÕû£¬µ«ÊǴ󲿷ֹؼüÃüÁî¶¼ÊÇÖ§³ÖµÄ£¬¾ßÌåÐÅÏ¢¿ÉÒԲο¼Dalvik-JDWPºÍART-JDWPÖÐËùÖ§³ÖµÄÏûÏ¢¡£

Androidµ÷ÊÔÔ­Àí

Androidµ÷ÊÔÄ£ÐÍ¿ÉÒÔ¿´×÷JPDA¿ò¼ÜµÄ¾ßÌåʵÏÖ¡£ÆäÖб仯±È½Ï´óµÄÒ»¸öÊÇJVM TIÊÊÅäÁËAndroidÉè±¸ÌØÓеÄDalvikÐéÄâ»ú/ARTÐéÄâ»ú£¬ÁíÒ»¸öÊÇJDWPµÄʵÏÖÖ§³ÖADBºÍSocketÁ½ÖÖͨÐÅ·½Ê½£¨ADBÈ«³ÆÎªAndroid Debug Bridge£¬ÊÇAndroidϵͳµÄÒ»¸öºÜÖØÒªµÄµ÷ÊÔ¹¤¾ß£©¡£ÕûÌåµÄµ÷ÊÔÄ£ÐÍÈçÏ£º

____________________________________
| |
| ADB Server (host) |
| |
Debugger <---> LocalSocket <----> RemoteSocket |
| || |
|___________________________||_______|
||
Transport || (TCP for emulator - USB for device) ||
||
___________________________||_______
| || |
| ADBD (device) || |
| || |
Android-VM | || |
JDWP-thread <====> LocalSocket <-> RemoteSocket |
| |
|____________________________________|

ÔËÐÐÔÚPCÉϵÄADB ServerºÍÔËÐÐÔÚAndroidÉ豸ÉϵÄADBDÊØ»¤½ø³ÌÖ®¼äͨ¹ýUSB»òÕßÎÞÏßÍøÂ罨Á¢Á¬½Ó£¬·Ö±ð¸ºÔðDebuggerºÍAndroidÉ豸µÄÐéÄâ»ú½øÐÐͨÐÅ¡£Ò»µ©Á¬½Ó½¨Á¢ÆðÀ´£¬DebuggerºÍAndroid VMͨ¹ý¡°ÇÅÁº¡±½øÐÐÊý¾ÝµÄ½»»»£¬ADB ServerºÍADBD¶ÔËüÃÇÀ´ËµÊÇ͸Ã÷µÄ¡£

Ô¶³Ìµ÷ÊÔ

×ÛÉÏ£¬ÒªÊµÏÖÔ¶³Ìµ÷ÊÔ£¬¹Ø¼üÐèҪʵÏÖÁ½²¿·Ö¹¦ÄÜ£º

1.Äܹ»×Ô¶¨ÒåJDWPͨµÀ¡£

2.ÄÜÄ£ÄâADBºÍADBDʵÏÖÏûÏ¢µÄת·¢¡£

ÏÈ¿´ÏÂÈçºÎʵÏÖ×Ô¶¨ÒåJDWPͨµÀ¡£

JDWPÆô¶¯¹ý³Ì

ÎÒÃÇ¿´ÏÂAndroid 5.0ϵͳÔÚÆô¶¯Ò»¸öÓ¦ÓÃʱÊÇÈçºÎÆô¶¯JDWP ThreadµÄ¡£

ͨ¹ýÉÏͼ¿ÉÒÔ¿´µ½£¬AndroidÔÚ´´½¨ÐéÄâ»úµÄͬʱ»á´´½¨Ò»¸öJDWP-Thread£¬JDWPĬÈÏÓÐADBºÍSocketÁ½ÖÖͨÐÅ·½Ê½¡£ÒªÊµÏÖÔ¶³Ìµ÷ÊÔ£¬ADBÕâÖÖ·½Ê½¿Ï¶¨²»ÊÊÓã¬ËùÒÔÄÜ·ñʵÏÖÒ»¸ö×Ô¶¨ÒåµÄSocketͨµÀÀ´ÊµÏÖJDWPµÄÏûϢת·¢³ÉÁËÎÊÌâµÄ¹Ø¼ü¡£

Hack-Native-JDWP

ͨ¹ýÔĶÁJDWPÆô¶¯Ô´Â루Android-API-21£©·¢ÏÖ£¬ÒªÏëÈÃJDWPͨ¹ý×Ô¶¨ÒåµÄSocketͨµÀ½øÐÐͨÐÅ£¬ÐèÒªÂú×ãÁ½¸öÌõ¼þ£º

1.Äܹ»ÐÞ¸ÄÈ«¾Ö±äÁ¿gJdwpOptionsµÄÖµ£¬Ê¹ÆäÅäÖÃΪSocketģʽ£¬²¢Ö¸Ã÷¶ÔÓ¦µÄ¶Ë¿ÚºÅ¡£

2.ʹÓÃеÄgJdwpOptions²ÎÊýÖØÐÂÆô¶¯JDWP-Thread¡£

ÔÚAndroidÖУ¬JDWPÏà¹Ø´úÂë·Ö±ð±»±àÒë³Élibart.so£¨Art£©ºÍlibdvm.so£¨Dalvik£©¡£Ð޸Ļòµ÷ÓÃÆäËûso¿âÖеĴúÂëÐèÒªÓõ½¶¯Ì¬¼ÓÔØ£¬Ê¹Óö¯Ì¬¼ÓÔØ£¬Ó¦ÓóÌÐòÐèÒªÏÈÖ¸¶¨Òª¼ÓÔØµÄ¿â£¬È»ºó½«¸Ã¿â×÷Ϊһ¸ö¿ÉÖ´ÐгÌÐòÀ´Ê¹Ó㨼´µ÷ÓÃÆäÖеĺ¯Êý£©¡£¶¯Ì¬¼ÓÔØAPI ¾ÍÊÇΪÁ˶¯Ì¬¼ÓÔØ¶ø´æÔڵģ¬ËüÔÊÐí¹²Ïí¿â¶ÔÓû§¿Õ¼ä³ÌÐò¿ÉÓá£ÏÂÃæ±í¸ñչʾÁËÕâ¸öÍêÕûµÄ API£º

ÔÚ½éÉÜÈçºÎµ÷Óö¯Ì¬¼ÓÔØ¹¦ÄÜ֮ǰ£¬ÏȽéÉÜÒ»ÏÂC/C++±àÒëÆ÷ÔÚ±àÒëÄ¿±êÎļþʱËù½øÐеÄÃû×ÖÐÞÊΣ¨·ûºÅ»¯£©¡£

·ûºÅ»¯

ÉÏÎÄÌáµ½ÒªÏë×Ô¶¨ÒåJDWP-Thread£¬Ê×ÏÈÐèÒªÐÞ¸ÄgJdwpOptionsµÄÖµ£¬¸ÃÖµÊÇÔÚdebugger.ccÖÐͨ¹ýDbg::ParseJdwpOptions·½·¨À´ÉèÖõģ¬ËùÒÔÖ»ÒªÓÃеÄÅäÖÃÖØÐµ÷ÓÃÒ»´ÎParseJdwpOptions¼´¿É¡£

ÈçºÎÕÒµ½Dbg::ParseJdwpOptionsÕâ¸öº¯ÊýµØÖ·ÄØ£¿ÎªÁ˱£Ö¤Ã¿¸öº¯Êý¡¢±äÁ¿Ãû¶¼ÓÐΨһµÄ±êʶ£¬±àÒëÆ÷ÔÚ½«Ô´´úÂë±àÒë³ÉÄ¿±êÎļþʱ»á¶Ô±äÁ¿Ãû»òº¯ÊýÃû½øÐÐÃû×ÖÐÞÊΡ£

ÏÈ¿´Ò»¸öÀý×Ó£¬ÏÂÃæµÄC++³ÌÐòÖÐÁ½¸öf()µÄ¶¨Ò壺

int f (void) { return 1; }int f (int) { return 0; }void g (void) { int i = f(), j = f(0); }

ÕâЩÊDz»Í¬µÄº¯Êý£¬³ýÁ˺¯ÊýÃûÏàͬÒÔÍâûÓÐÈκιØÏµ¡£Èç¹û²»×öÈκθıäÖ±½Ó°ÑËüÃǵ±³ÉC´úÂ룬½á¹û½«µ¼ÖÂÒ»¸ö´íÎó£ºCÓïÑÔ²»ÔÊÐíÁ½¸öº¯ÊýͬÃû¡£ËùÒÔ£¬C++±àÒëÆ÷½«»á°ÑËüÃǵÄÀàÐÍÐÅÏ¢±àÂë³É·ûºÅÃû£¬½á¹ûÀàËÆÏÂÃæµÄ´úÂ룺

int __f_v (void) { return 1; }int __f_i (int) { return 0; }void __g_v (void) { int i = __f_v(), j = __f_i(0); }

¿ÉÒÔͨ¹ýnmÃüÁî²é¿´soÎļþÖеķûºÅÐÅÏ¢¡£

nm -D libart.so | grep ParseJdwpOptions
001778d0 T _ZN3art3Dbg16ParseJdwpOptionsERKNSt3__112basic

_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE

ÕâÑù¾ÍµÃµ½ÁËParseJdwpOptionsº¯ÊýÔÚ¶¯Ì¬Á´½Ó¿âÎļþÖзûºÅ»¯ÒÔºóµÄº¯ÊýÃû¡£

ÕÒµ½·ûºÅ»¯Á˵ĺ¯ÊýÃûºó£¬¾Í¿ÉÒÔͨ¹ýµ÷Óö¯Ì¬Á´½Ó¿âÖеĺ¯ÊýÖØÐÂÆô¶¯JDWP-Thread¡£²¿·Ö´úÂëÈçÏ£¨ÒÔÏ´úÂëÖ»Õë¶ÔAndroid-API-21ºÍAndroid-API-22°æ±¾ÓÐЧ£©£º

void *handler = dlopen("/system/lib/libart

.so", RTLD_NOW); if(handler == NULL){
LOGD(LOG_TAG,env->NewStringUTF(dlerror()));
} //¶ÔÓÚdebuggable falseµÄÅäÖã¬ÖØÐÂÉèÖÃΪ¿Éµ÷ÊÔ
void (*allowJdwp)(bool);
allowJdwp = (void (*)(bool)) dlsym(handler,

"_ZN3art3Dbg14SetJdwpAllowedEb");
allowJdwp(true); void (*pfun)();

//¹Ø±Õ֮ǰÆô¶¯µÄjdwp-thread
pfun = (void (*)()) dlsym(handler, "_ZN3art3Dbg8S

topJdwpEv");
pfun(); //ÖØÐÂÅäÖÃgJdwpOptions
bool (*parseJdwpOptions)(const std::string&);
parseJdwpOptions = (bool (*)(const std::string&))

dlsym(handler, "_ZN3art3Dbg16ParseJdwpOptionsERKNSt3

__112basic_stringIc

NS1_11char_traitsIcEENS1_9allocatorIcEEEE"); std::string

options = "transport=dt_socket,address=8000,server=y,suspend=n";
parseJdwpOptions(options); //ÖØÐÂstartJdwp
pfun = (void (*)()) dlsym(handler, "_ZN3art3Dbg9StartJdwpEv");

ÒÔÉÏ´úÂë¹Ø±ÕÁË֮ǰ¿ÉÄÜ´æÔÚµÄJDWP-Thread£¬Í¬Ê±¿ªÆôÒ»¸ö±¾µØµÄSocketͨµÀÀ´½øÐÐͨÐÅ£¬ÕâÑù¾ÍÄÜͨ¹ý±¾µØµÄSocketͨµÀÀ´½øÐÐJDWPÏûÏ¢µÄ´«µÝ¡£

Í»ÆÆ7.0¶¯Ì¬Á´½ÓµÄÏÞÖÆ

ͨ¹ýÉÏÃæ´úÂë¿ÉÖª£¬ÊµÏÖ×Ô¶¨ÒåµÄJDWPͨµÀÖ÷ÒªÊDzÉÓö¯Ì¬µ÷ÓÃlibart.so/libdvm.soÖеĺ¯ÊýʵÏÖ¡£µ«´Ó Android 7.0 ¿ªÊ¼£¬ÏµÍ³½«×èÖ¹Ó¦Óö¯Ì¬Á´½Ó·Ç¹«¿ª NDK¿â£¬ÏêÇéÇë²Î¿¼¡¶Android 7.0ÐÐΪ±ä¸ü¡·£¬Ç¿ÖƵ÷Óûá²úÉúÈçÏÂCrash£º

java.lang.UnsatisfiedLinkError: dlopen failed: library "/system/lib/libart.so" needed or dlopened by "/system/lib/libnativeloader.so" is not accessible for the namespace "classloader-namespace"

ÈçºÎÈÆ¹ýÕâ¸öÏÞÖÆÀ´¶¯Ì¬µ÷ÓÃlibart.soÖеķ½·¨£¿¼ÈȻֱ½Óµ÷ÓÃdlopen»áʧ°Ü£¬ÄÇÊDz»ÊÇ¿ÉÒÔÄ£ÄâdlopenºÍdlsymµÄʵÏÖÀ´ÈƹýÕâ¸öÏÞÖÆ£¿

dlopenºÍdlsym·Ö±ð·µ»Ø¶¯Ì¬Á´½Ó¿âÔÚÄÚ´æÖеľä±úºÍij¸ö·ûºÅµÄµØÖ·£¬ËùÒÔÖ»ÒªÄÜÕÒµ½dlopen·µ»ØµÄ¾ä±ú²¢Í¨¹ý¾ä±úÕÒµ½dlsym·ûºÅ¶ÔÓ¦µÄµØÖ·£¬¾ÍÏ൱ÓÚʵÏÖÁËÕâÁ½¸öº¯ÊýµÄ¹¦ÄÜ¡£libart.so»áÔÚ³ÌÐòÆô¶¯Ö®ºó¾Í±»¼ÓÔØµ½ÄÚ´æÖУ¬¿ÉÒÔÔÚ/proc/self/mapsÕÒµ½µ±Ç°½ø³ÌÖÐlibart.soÔÚÄÚ´æÖÐÓ³ÉäµÄµØÖ·£º

vbox86p:/ # cat /proc/1665/maps | grep libart.so

e2d50000-e3473000 r-xp 00000000 08:06 1087 /system/lib/libart.so
e3474000-e347c000 r--p 00723000 08:06 1087 /system/lib/libart.so
e347c000-e347e000 rw-p 0072b000 08:06 1087 /system/lib/libart.so

ÕâÀïlibart.so±»·Ö³ÉÁËÈý¸öÁ¬Ðø×ӿռ䣬´Óe2d50000¿ªÊ¼¡£

ÈçºÎ²ÅÄÜÔÚÄÚ´æÖÐÕÒµ½ÏëÒª´ò¿ªµÄº¯ÊýµØÖ·£¿ÎÒÃÇÏÈ¿´ÏÂELFÎļþ½á¹¹£º

ҪʵÏÖdlsym£¬Ê×ÏÈÒª±£Ö¤²éÕҵķûºÅÔÚ¶¯Ì¬·ûºÅ±íÖÐÄÜÕÒµ½£¬ÔÚELFÎļþÖУ¬SHT_DYNSYM¶ÔÓ¦µÄSection¶¨ÒåÁ˵±Ç°ÎļþÖеĶ¯Ì¬·ûºÅ£»SHT_STRTAB¶¨ÒåÁ˶¯Ì¬¿âÖÐËùÓÐ×Ö·û´®£»SHT_PROGBITSÔò¶¨ÒåÁ˶¯Ì¬¿âÖж¨ÒåµÄÐÅÏ¢¡£ÈçºÎÕÒµ½ÕâЩSection£º

1.ͨ¹ýÄÚ´æÓ³ÉäµÄ·½Ê½°Ñlibart.soÓ³Éäµ½ÄÚ´æÖУ»

2.°´ÕÕELFÎļþ½á¹¹½âÎöÓ³Éäµ½ÄÚ´æÖеÄlibart.so£»

3.½âÎöSHT_DYNSYM£¬²¢°Ñµ±Ç°section¸´ÖƵ½ÄÚ´æÖУ»

4.½âÎöSHT_STRTAB£¬²¢°Ñµ±Ç°section¸´ÖƵ½ÄÚ´æÖУ¨ºóÃæÐèÒª¸ù¾ÝSHT_STRTABÀ´ÕÒµ½Ìض¨µÄ·ûºÅ£©£»

5.½âÎöSHT_PROGBITS£¬µÃµ½µ±Ç°ÄÚ´æÓ³ÉäµÄÆ«ÒÆµØÖ·£¬ÕâÀïҪעÒ⣺²»Í¬½ø³ÌÖÐÏàͬ¶¯Ì¬¿âµÄͬһ¸öº¯ÊýµÄÆ«ÒÆµØÖ·ÊÇÒ»ÑùµÄ¡£

ÒÔÉÏÂß¼­µÄ²¿·Ö´úÂëÆ¬¶ÎÈçÏ£º

fd = open(libpath, O_RDONLY);
size = lseek(fd, 0, SEEK_END); if(size <= 0)

fatal("lseek() failed for %s", libpath);

elf = (Elf_Ehdr *) mmap(0, size, PROT_READ,

MAP_SHARED, fd, 0);
close(fd);
fd = -1; if(elf == MAP_FAILED) fatal("mmap()

failed for %s", libpath);

ctx = (struct ctx *) calloc(1, sizeof(struct ctx))

; if(!ctx) fatal("no memory for %s", libpath);

//ͨ¹ý/proc/self/proc ÕÒµ½µÄlibart.soµÄÆðʼµØÖ·
ctx->load_addr = (void *) load_addr;
shoff = ((char *) elf) + elf->e_shoff; for(k = 0; k < elf->e_shnum; k++) {
shoff = (char *)shoff + elf->e_shentsize;
Elf_Shdr *sh = (Elf_Shdr *) shoff;
log_dbg("%s: k=%d shdr=%p type=%x", __func__, k,

sh, sh->sh_type); switch(sh->sh_type) { case

SHT_DYNSYM: if(ctx->dynsym) fatal("%s: duplicate

DYNSYM sections", libpath); /* .dynsym */
ctx->dynsym = malloc(sh->sh_size); if(!ctx->dynsym)

fatal("%s: no memory for .dynsym", libpath); memcpy

(ctx->dynsym, ((char *) elf) + sh->sh_offset, sh->

sh_size); //ctx->nsyms ¶¯Ì¬·ûºÅ±íµÄ¸öÊý
ctx->nsyms = (sh->sh_size/sizeof(Elf_Sym)) ; break; case SHT_STRTAB: if(ctx->dynstr) break; /* .dynstr is

guaranteed to be the first STRTAB */
ctx->dynstr = malloc(sh->sh_size); if(!ctx->dynstr)

fatal("%s: no memory for .dynstr", libpath);

memcpy(ctx->dynstr, ((char *) elf) + sh->sh_offset, sh->sh_size); break; //µ±Ç°¶ÎÄÚÈÝΪprogram defined

information£º³ÌÐò¶¨ÒåÇø
case SHT_PROGBITS: if(!ctx->dynstr || !ctx->dynsym)

break; //µÃµ½Æ«ÒƵØÖ·
ctx->bias = (off_t) sh->sh_addr - (off_t)

sh->sh_offset; break;
}
} //¹Ø±ÕÄÚ´æÓ³Éä
munmap(elf, size);

½ÓÏÂÀ´¾Í¿ÉÒÔ¸ù¾ÝÒªÕҵķûºÅÃûÔÚSHT_DYNSYMÖжÔÓ¦µÄλÖõõ½¾ßÌåµÄº¯ÊýÖ¸Õ룬²¿·Ö´úÂëÈçÏ£º

void *fake_dlsym(void *handle, const char *name)

{ int k; struct ctx *ctx = (struct ctx *) handle;
Elf_Sym *sym = (Elf_Sym *) ctx->dynsym; char *strings

= (char *) ctx->dynstr; for(k = 0; k < ctx->nsyms;

k++, sym++) if(strcmp(strings + sym->st_name, name)

== 0) { //¶¯Ì¬¿âµÄ»ùµØÖ· + µ±Ç°·ûºÅsectionµØÖ· -

Æ«ÒÆµØÖ·
return (char *)ctx->load_addr + sym->st_value -

ctx->bias;
} return 0;
}

ͨ¹ýÒÔÉÏÄ£ÄâdlopenºÍdlsymµÄÂß¼­£¬ÎÒÃdzɹ¦ÈƹýÁËϵͳ½«×èÖ¹Ó¦Óö¯Ì¬Á´½Ó·Ç¹«¿ª NDK¿âµÄÏÞÖÆ¡£

ÏûϢת·¢

Íê³ÉÉÏÃæÂß¼­ÒÔºó¾Í¿ÉÒÔͨ¹ý±¾µØSocketÔÚÐéÄâ»úºÍÓû§½ø³ÌÖ®¼ä´«µÝJDWPÏûÏ¢¡£µ«ÊÇҪʵÏÖÔ¶³Ìµ÷ÊÔ£¬»¹ÐèÒªÔ¶³ÌÏ·¢ÐéÄâ»úµÄµ÷ÊÔÖ¸Áî²¢»Ø´«Ö´Ðнá¹û¡£ÎÒÃÇͨ¹ýAppÔ­ÓÐPushͨµÀ¼ÓÉÏÏßÉÏÏûϢת·¢·þÎñ£¬ÊµÏÖÁËÕû¸öµ÷ÊÔ¹¤¾ßµÄÏûϢת·¢¹¦ÄÜ£º

Proguard¶Ôµ÷ÊÔµÄÓ°Ïì

Õý³£·¢²¼µ½Êг¡µÄÏîÄ¿¶¼»áͨ¹ýProguad½øÐлìÏý£¬²»Í¬Á¦¶ÈµÄ»ìÏýÅäÖûáÉú³É²»Í¬µÄ×Ö½ÚÂëÎļþ¡£¶Ôµ÷ÊÔ¹¦ÄÜÓ°Ïì±È½Ï´óµÄÅäÖÃÓÐÁ½¸ö£º

1.LineNumberTable

2.LocalVariableTable

Èç¹ûProguardÖÐûÓжÔÕâÁ½¸öÊôÐÔ½øÐÐKeep£¬ÄǾ­¹ýProguard´¦ÀíµÄ·½·¨×Ö½ÚÂëÖлáȱʧÕâÁ½¸öÄ£¿é£¬¶Ôµ÷ÊÔµÄÓ°Ïì·Ö±ðÊÇÎÞ·¨ÔÚ·½·¨µÄijһÐÐÉèÖöϵãºÍÎÞ·¨»ñÈ¡µ±Ç°±¾µØ±äÁ¿µÄÖµ£¨µ«ÄÜ»ñÈ¡µ½·½·¨²ÎÊý±äÁ¿ºÍÀà³ÉÔ±±äÁ¿£©¡£Ò»°ãΪÁËÔÚÓ¦Ó÷¢Éú±ÀÀ£Ê±ÄÜ»ñÈ¡µ½µ÷ÓÃÕ»ÖÐÿ¸öº¯Êý¶ÔÓ¦µÄÐкţ¬ÐèÒª±£ÁôLineNumberTable£¬Í¬Ê±ÎªÁ˼õÉÙ°üÌå»ý»á·ÅÆúLocalVariableTable¡£ÔÚûÓÐLocalVariableTableµÄÇé¿öÏ£¬¿ÉÒÔͨ¹ýµ÷ÓÃExecuteÃüÁîµÃµ½Ò»Ð©ÔËÐÐʱ½á¹û¼ä½ÓµÃ»ñÈ¡µ½±¾µØ±äÁ¿¡£

JDIµÄʵÏÖ

Õû¸öÏûÏ¢½»»¥Á÷³ÌÅÜͨÒԺ󣬽ÓÏÂÀ´Òª×öµÄ¾ÍÊǸù¾ÝJDI¹æ·¶×÷½øÒ»²½µÄ·â×°¡£ÎªÁË·½±ã¿ìËÙµ÷ÊÔ£¬Ä¿Ç°µ÷ÊÔ¹¤¾ßµÄǰ¶ËʵÏÖÖ÷Òª²Î¿¼ÁËLLDBµÄµ÷ÊÔÁ÷³Ì£¬Í¨¹ýÉèÖÃÃüÁîµÄ·½Ê½½øÐе÷ÊÔ£¬ÕûÌåÑùʽÈçÏÂͼËùʾ£º

×ܽá

±¾ÎÄ´Óµ÷²éÏßÉÏÎÊÌâµÄ³£¼ûÊÖ¶ÎÈëÊÖ£¬½éÉÜÁ˵½µê²ÍÒûÒÆ¶¯ÍŶÓÔÚʵÏÖÔ¶³Ìµ÷ÊÔ¹ý³ÌÖеij¢ÊÔºÍ̽Ë÷¡£Í¨¹ýÔ¶³Ìµ÷ÊÔ¿ÉÒÔ·½±ã¿ì½ÝµØ»ñÈ¡Óû§µ±Ç°AppÔËÐÐʱµÄ״̬£¬ÖúÁ¦¿ª·¢Õß¿ìËÙ¶¨Î»ÏßÉÏÎÊÌâ¡£

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

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

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

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
Androidϵͳ¿ª·¢
AndroidÓ¦Óÿª·¢
ÊÖ»úÈí¼þ²âÊÔ