2015-04-01 49 views
1

我正在檢查Android上的一些ARM崩潰,並且實現了一些內存地址位置不是2字節對齊(THUMB/ARM),但有些是。有人知道這是爲什麼嗎?這裏是一個墓碑的例子:核心轉儲地址不是字節對齊

Stack frame #00 pc 00072c9a /system/lib/libdvm.so (dvmAbort+170) 
Stack frame #01 pc 00050f6b /system/lib/libdvm.so (ScopedCheck::checkInstanceFieldID(_jobject*, _jfieldID*)+379) 
Stack frame #02 pc 0005db56 /system/lib/libdvm.so (Check_SetBooleanField(_JNIEnv*, _jobject*, _jfieldID*, unsigned char)+150) 
Stack frame #03 pc 00003a93 /system/lib/libmytestt.so (Java_com_test_jni_MyLibWrapper_getMonitorSample+259) 
Stack frame #04 pc 0002d850 /system/lib/libdvm.so (dvmPlatformInvoke+80) 
Stack frame #05 pc 00085b48 /system/lib/libdvm.so (dvmCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+648) 
Stack frame #06 pc 000505db /system/lib/libdvm.so (dvmCheckCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+59) 
Stack frame #07 pc 0008b96d /system/lib/libdvm.so (dvmResolveNativeMethod(unsigned int const*, JValue*, Method const*, Thread*)+317) 
Stack frame #08 pc 00170ff1 /system/lib/libdvm.so 

可以看到#00,#02是2字節對齊的,而#01和#03不是。爲什麼會這樣解釋?謝謝。

回答

2

我猜想奇數地址表明這些函數處於THUMB模式,而偶數地址處於ARM模式。當從函數bx lr返回時,處理器將根據地址的最低位從ARM模式切換到THUMB或反之,所以我猜這就是您最終在回溯中看到的結果。

+1

真正的祕密是00072c9a和0005db56,它們沒有設置lsb,但不能成爲ARM指令,因爲它們不是字對齊的。 – Notlikethat 2015-04-01 10:42:38