核心转储地址未字节对齐

core dump addresses not byte aligned

我正在检查 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 不是。任何解释为什么会这样?谢谢

我猜奇数地址表示那些函数处于THUMB模式,而偶数地址表示这些函数处于ARM模式。当从带有 bx lr 的函数返回时,处理器将根据地址的最低位从 ARM 模式切换到 THUMB,反之亦然,所以我猜这也是你最终在回溯中看到的.