利用objdump找到程序挂死位置

利用objdump找到程序挂死位置


一、问题描述

程序崩溃时效果如下:
利用图片中的pc和lr寄存器

二、使用步骤

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/

即可

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值