利用objdump找到程序挂死位置
一、问题描述
程序崩溃时效果如下:
二、使用步骤
1.找到动态链接库
在终端代码仓下输入下面的命令:
find -name libc.so
find -name libc.so
终端输出:
./prebuilts/aosp_prebuilt_libs/asdk_libs/ndk/platforms/current/arch-arm/usr/lib/libc.so
./prebuilts/aosp_prebuilt_libs/minisys/system/apex/com.android.runtime-hos.debug/lib/bionic/libc.so
./prebuilts/aosp_prebuilt_libs/minisys/system/lib/bootstrap/libc.so
./prebuilts/aosp_prebuilt_libs/minisys/system/lib/libc.so
./prebuilts/lite/sysroot/usr/lib/arm-linux-ohosmusl/a7_softfp_neon-vfpv4/libc.so
./prebuilts/lite/sysroot/usr/lib/arm-linux-ohosmusl/a7_hard_neon-vfpv4/libc.so
./prebuilts/lite/sysroot/usr/lib/arm-linux-ohosmusl/libc.so
./prebuilts/lite/sysroot/usr/lib/arm-linux-ohosmusl/a7_soft/libc.so
./prebuilts/lite/sysroot/usr/lib/arm-liteos/a7_softfp_neon-vfpv4/debug/libc.so
./prebuilts/lite/sysroot/usr/lib/arm-liteos/a7_softfp_neon-vfpv4/libc.so
./prebuilts/lite/sysroot/usr/lib/arm-liteos/a7_hard_neon-vfpv4/debug/libc.so
./prebuilts/lite/sysroot/usr/lib/arm-liteos/a7_hard_neon-vfpv4/libc.so
./prebuilts/lite/sysroot/usr/lib/arm-liteos/debug/libc.so
./prebuilts/lite/sysroot/usr/lib/arm-liteos/libc.so
./prebuilts/lite/sysroot/usr/lib/arm-liteos/a7_soft/debug/libc.so
./prebuilts/lite/sysroot/usr/lib/arm-liteos/a7_soft/libc.so
./out/hispark_taurus/ipcamera_hispark_taurus/obj/kernel/liteos_a/musl/libc.so
./out/hispark_taurus/ipcamera_hispark_taurus/obj/kernel/liteos_a/rootfs/lib/libc.so
./out/hispark_taurus/ipcamera_hispark_taurus/libs/libc.so
./out/hispark_taurus/ipcamera_hispark_taurus/rootfs/lib/libc.so
./out/hispark_aries/ipcamera_hispark_aries/obj/kernel/liteos_a/musl/libc.so
./out/hispark_aries/ipcamera_hispark_aries/obj/kernel/liteos_a/rootfs/lib/libc.so
./out/hispark_aries/ipcamera_hispark_aries/libs/libc.so
./out/hispark_aries/ipcamera_hispark_aries/rootfs/lib/libc.so
2.反汇编
我们要找的so文件是:
./prebuilts/lite/sysroot/usr/lib/arm-liteos/a7_softfp_neon-vfpv4/libc.so
反汇编:在终端输入
llvm-objdump -ds ./prebuilts/lite/sysroot/usr/lib/arm-liteos/a7_softfp_neon-vfpv4/libc.so > libc.asm
三、根据反汇编文件找到挂死位置
用notepad++打开,找到pc所指向的地址:
00092d80 pthread_exit:
92d80: 80 d0 4d e2 sub sp, sp, #128
92d84: 00 50 a0 e1 mov r5, r0
92d88: a4 06 00 eb bl #6800 <__pthread_self>
92d8c: 00 40 a0 e1 mov r4, r0
92d90: 01 00 a0 e3 mov r0, #1
92d94: 2c 00 c4 e5 strb r0, [r4, #44]
92d98: 00 00 a0 e3 mov r0, #0
92d9c: 44 50 84 e5 str r5, [r4, #68]
92da0: 48 10 94 e5 ldr r1, [r4, #72]
92da4: 2d 00 c4 e5 strb r0, [r4, #45]
92da8: 00 00 51 e3 cmp r1, #0
92dac: 05 00 00 0a beq #20 <pthread_exit+0x48>
92db0: 00 20 91 e5 ldr r2, [r1]
92db4: 03 00 91 e9 ldmib r1, {r0, r1}
92db8: 48 10 84 e5 str r1, [r4, #72]
92dbc: 32 ff 2f e1 blx r2
92dc0: 48 10 94 e5 ldr r1, [r4, #72]
92dc4: f7 ff ff ea b #-36 <pthread_exit+0x28>
92dc8: 0f 03 00 eb bl #3132 <__pthread_tsd_run_dtors>
92dcc: 64 50 84 e2 add r5, r4, #100
92dd0: 05 00 a0 e1 mov r0, r5
92dd4: c5 f6 ff eb bl #-9452 <__lock>
92dd8: 0d 00 a0 e1 mov r0, sp
92ddc: 93 b8 ff eb bl #-73140 <__block_app_sigs>
92de0: 72 ff ff eb bl #-568 <__tl_lock>
92de4: 0c 00 94 e5 ldr r0, [r4, #12]
92de8: 04 00 50 e1 cmp r0, r4
92dec: 24 00 00 0a beq #144 <pthread_exit+0x104>
92df0: ac 10 9f e5 ldr r1, [pc, #172]
92df4: 01 10 8f e0 add r1, pc, r1
92df8: 0c 20 91 e5 ldr r2, [r1, #12]
92dfc: 01 20 42 e2 sub r2, r2, #1
92e00: 0c 20 81 e5 str r2, [r1, #12]
92e04: 08 10 94 e5 ldr r1, [r4, #8]
92e08: 08 10 80 e5 str r1, [r0, #8]
92e0c: 08 10 94 e5 ldr r1, [r4, #8]
92e10: 0c 00 81 e5 str r0, [r1, #12]
92e14: 08 40 84 e5 str r4, [r4, #8]
92e18: 0c 40 84 e5 str r4, [r4, #12]
可以看出位置在pthread_exit函数。
我们在pthread_exit函数中加打印语句即可查出出问题位置。
附:如何找到对应的动态链接库so文件
libc.so的编译规则生成在Makefile中,我们需要在Makefile中找到:
在终端输入:
输出:
cd kernel/liteos_a/
grep "libc.so" -nr
输出:
testsuites/unittest/fs/jffs/full/It_vfs_test_link_001.cpp:46: ret = link("/lib/libc.so", pathname1);
testsuites/unittest/fs/jffs/smoke/It_test_fstatfs_001.cpp:43: fd = open("/lib/libc.so", O_RDONLY);
testsuites/unittest/fs/jffs/smoke/It_test_fstatfs_001.cpp:46: TEST_PRINT("[INFO]The \"/lib/libc.so\" 's,buf->f_type=0x%x\n", buf.f_type);
testsuites/unittest/fs/jffs/smoke/It_test_faccessat_001.cpp:42: argv[1] = (char *)"/lib/libc.so";
testsuites/unittest/fs/jffs/smoke/It_test_fstatfs_002.cpp:89: fd = open("/lib/libc.so", O_RDONLY);
testsuites/unittest/fs/jffs/smoke/It_test_fstatfs_002.cpp:109: fd = open("/lib/libc.so", O_RDONLY);
testsuites/unittest/dynload/smoke/dynload_test_004.cpp:34:#define LIBCSO_REAL_PATH "/lib/libc.so"
testsuites/unittest/dynload/smoke/dynload_test_002.cpp:34:#define LIBCSO_REAL_PATH "/lib/libc.so"
testsuites/unittest/dynload/smoke/dynload_test_002.cpp:35:#define LIBCSO_RELATIVE_PATH "../../lib/libc.so"
testsuites/unittest/mem/vm/smoke/mmap_test_005.cpp:33:#define MAP_TEST_FILE "/lib/libc.so"
testsuites/unittest/IO/full/It_stdio_hasmntopt_001.cpp:72: if (fopen("/lib/libc.so", "r")) {
Makefile:171: $(HIDE)cp -f $(LITEOSTOPDIR)/../../prebuilts/lite/sysroot/usr/lib/$(LLVM_TARGET)/a7_softfp_neon-vfpv4/libc.so $(OUT)/musl
Makefile:174: $(HIDE)cp -f $(LITEOS_COMPILER_PATH)/target/usr/lib/libc.so $(OUT)/musl
kernel/extended/dynload/include/los_load_elf.h:57:#define INTERP_FULL_PATH "/lib/libc.so"
Binary file tools/menuconfig/mconf matches
Binary file tools/menuconfig/conf matches
更改Makefile
vi Makefile +171
grep LOSCFG_COMPILER_CLANG_LLVM -nr
arch/arm/arm/src/los_exc.c:718:#ifdef LOSCFG_COMPILER_CLANG_LLVM
include/generated/autoconf.h:31:#define LOSCFG_COMPILER_CLANG_LLVM 1
include/config/auto.conf:29:LOSCFG_COMPILER_CLANG_LLVM=y
lib/libc/Makefile:40:ifeq ($(LOSCFG_COMPILER_CLANG_LLVM), y)
.config:10:LOSCFG_COMPILER_CLANG_LLVM=y
apps/config.mk:46:ifeq ($(LOSCFG_COMPILER_CLANG_LLVM), y)
apps/shell/Makefile:56:ifeq ($(LOSCFG_COMPILER_CLANG_LLVM), y)
apps/init/Makefile:42:ifeq ($(LOSCFG_COMPILER_CLANG_LLVM), y)
apps/tftp/Makefile:55:ifeq ($(LOSCFG_COMPILER_CLANG_LLVM), y)
Makefile:170:ifeq ($(LOSCFG_COMPILER_CLANG_LLVM), y)
.config.old:10:LOSCFG_COMPILER_CLANG_LLVM=y
kernel/extended/vdso/usr/Makefile:41:ifeq ($(LOSCFG_COMPILER_CLANG_LLVM), y)
tools/build/mk/los_config.mk:33:else ifeq ($(LOSCFG_COMPILER_CLANG_LLVM), y)
tools/build/mk/los_config.mk:131:else ifeq ($(LOSCFG_COMPILER_CLANG_LLVM), y)
tools/build/mk/los_config.mk:137:ifeq ($(LOSCFG_COMPILER_CLANG_LLVM), y)
tools/build/mk/los_config.mk:242:ifeq ($(LOSCFG_COMPILER_CLANG_LLVM), y)
tools/build/mk/los_config.mk:455: ifeq ($(LOSCFG_COMPILER_CLANG_LLVM), y)
tools/build/mk/los_config.mk:521:ifeq ($(LOSCFG_COMPILER_CLANG_LLVM), y)
tools/build/mk/los_config.mk:567:ifeq ($(LOSCFG_COMPILER_CLANG_LLVM), y)
tools/build/mk/los_config.mk:590:ifneq ($(LOSCFG_COMPILER_CLANG_LLVM), y)
tools/build/mk/los_config.mk:647:ifneq ($(LOSCFG_COMPILER_CLANG_LLVM), y)
tools/build/mk/los_config.mk:653:ifneq ($(LOSCFG_COMPILER_CLANG_LLVM), y)
tools/build/mk/los_config.mk:670:ifneq ($(LOSCFG_COMPILER_CLANG_LLVM), y)
tools/build/mk/los_config.mk:682:ifeq ($(LOSCFG_COMPILER_CLANG_LLVM), y)
输入
fg
输出
vi Makefile +171
[1]+ Stopped vi Makefile +171
输入
make help
输出
-------------------------------------------------------
1.====make help: get help infomation of make
2.====make: make a debug version based the .config
3.====make debug: make a debug version based the .config
4.====make release: make a release version for all platform
5.====make release PLATFORM=xxx: make a release version only for platform xxx
6.====make rootfsdir: make a original rootfs dir
7.====make rootfs FSTYPE=***: make a original rootfs img
8.====make test: make the testsuits_app and put it into the rootfs dir
9.====make test_apps FSTYPE=***: make a rootfs img with the testsuits_app in it
xxx should be one of (hi3516cv300 hi3516ev200 hi3556av100/cortex-a53_aarch32 hi3559av100/cortex-a53_aarch64)
*** should be one of (jffs2)
-------------------------------------------------------
/home/phchang/openharmony_master_test/kernel/liteos_a/../../prebuilts/lite/sysroot/usr/lib/arm-liteos/a7_softfp_neon-vfpv4/libc.so
找到进入:
cd /home/phchang/openharmony_master_test/kernel/liteos_a/../../prebuilts/lite/sysroot/usr/lib/arm-liteos/a7_softfp_neon-vfpv4/
即可