lldb & Coredump调试

1,012 阅读33分钟

工具路径

Android从NDK 24开始只包含lldb

{NDK-Dir}/toolchains/llvm/prebuilt/darwin-x86_64/bin/lldb //bin {NDK-Dir}/toolchains/llvm/prebuilt/darwin-x86_64/bin/lldb.sh //启动脚本

脚本内容

#!/bin/bash
CURDIR=$(cd $(dirname $0) && pwd)
export PYTHONHOME="$CURDIR/../python3"
export DYLD_LIBRARY_PATH="$CURDIR/../python3/lib:$DYLD_LIBRARY_PATH"
"$CURDIR/lldb" "$@"

为了使用方便,可以将lldb.sh的路径写入环境变量(NDK-Dir是自己的NDK路径)

$ vi ~/.bash_profile
export PATH=${PATH}:{NDK-Dir}/toolchains/llvm/prebuilt/darwin-x86_64/bin

启动lldb加载coredump

执行lldb

先加载lib库
(lldb) settings set target.exec-search-paths /Users/pang/lib

再加载Core和app_process
(lldb) target create "app_process64" --core "core-2136-2166" 

若输出不完整,尝试强制刷新符号:
(lldb) settings set target.load-script-from-symbol-file true
(lldb) bt
* thread #1, name = 'test.crash', stop reason = signal SIGSEGV
  * frame #0: 0x00000071b32e84f4 libnative-lib.so`sample_test_dlsym(filename="", symbol="", debug_symbol=true, cache=0x0000007fc926aa50, try_force_dlopen=false) at sample.c:70:6
    frame #1: 0x00000071b32e8198 libnative-lib.so`crash_test(env=0xb40000735ec2d650, thiz=0x00000074d82ac188) at sample.c:140:3
    frame #2: 0x000000722b227434 libart.so`art_quick_generic_jni_trampoline at quick_entrypoints_arm64.S:1872
    frame #3: 0x000000722b210c84 libart.so`art_quick_invoke_static_stub at quick_entrypoints_arm64.S:688
(lldb) image add /Users/Downloads/coredump/lib/libart.so
(lldb) image add /Users/Downloads/coredump/lib/libnative-lib.so
(lldb) image add /Users/Downloads/coredump/lib/libc++_shared.so 
(lldb) image add /Users/Downloads/coredump/lib/boot-framework.oat
(lldb) image list
[  0] E8762C07-2E6C-37BB-8093-E340CC42E9F2 0x00000061cd703000 /Users/Downloads/coredump/app_process64 
[  1] B221DDF9-4935-96DE-C8A8-4B0692083BEF libart.so[0x0000000000000000] /Users/Downloads/coredump/lib/libart.so 
[  2] 439D8A40-5A06-C778-392C-DCD9FC7876E5-48F7AD00 libnative-lib.so[0x0000000000000000] /Users/Downloads/coredump/lib/libnative-lib.so 
[  3] 7DC5F791-24FB-C1A4-8650-6D25783650B0-7E98A111 libc++_shared.so[0x0000000000000000] /Users/Downloads/coredump/lib/libc++_shared.so 
[  4] 4F98E153-22C5-8B22-E963-0BB1EFBF0633-EB3F0536 boot-framework.oat[0x0000000000000000] /Users/Downloads/coredump/lib/boot-framework.oat 

常用命令

堆栈打印

使用bt命令,如果嫌堆栈打印太长,可以加一个值限制,如bt 5,只打印前5帧

(lldb) bt
* thread #1, name = 'test.crash', stop reason = signal SIGSEGV
  * frame #0: 0x00000071b32e84f4 libsample.so`sample_test_dlsym(filename="", symbol="", debug_symbol=true, cache=0x0000007fc926aa50, try_force_dlopen=false) at sample.c:70:6
    frame #1: 0x00000071b32e8198 libsample.so`crash_test(env=0xb40000735ec2d650, thiz=0x00000074d82ac188) at sample.c:140:3
    frame #2: 0x000000722b227434 libart.so`art_quick_generic_jni_trampoline at quick_entrypoints_arm64.S:1872
    frame #3: 0x000000722b210c84 libart.so`art_quick_invoke_static_stub at quick_entrypoints_arm64.S:688

所有线程堆栈打印

(lldb) thread backtrace all
* thread #1, name = 'ndroid.lark', stop reason = signal SIGSEGV
    frame #0: 0x00000070261efed8 libc.so`getenv + 76
  * frame #1: 0x0000006f76dbb560 libsscronet.so`event_base_new + 220
    frame #2: 0x0000006f76c2858c libsscronet.so`base::MessagePumpLibevent::MessagePumpLibevent() + 48
    frame #3: 0x0000006f76be0ff0 libsscronet.so`base::MessagePump::Create(base::MessagePump::Type) + 84
    frame #4: 0x0000006f76be0af8 libsscronet.so`base::MessageLoop::BindToCurrentThread() + 60
    frame #5: 0x0000006f76c144e8 libsscronet.so`base::internal::MessageLoopTaskEnvironment::BindToCurrentThread(base::TimerSlack) + 28
    frame #6: 0x0000006f76c14318 libsscronet.so`base::Thread::ThreadMain() + 224
    frame #7: 0x0000006f76c22418 libsscronet.so`base::(anonymous namespace)::ThreadFunc(void*) + 100
    frame #8: 0x0000007026204a70 libc.so`__pthread_start(void*) + 40
    frame #9: 0x00000070261a56e8 libc.so`__start_thread + 72
  
thread #2, stop reason = signal SIGSEGV
    frame #0: 0x0000000071e6562c
    frame #1: 0x0000006f9fde162c libart.so`art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*) + 236
    frame #2: 0x0000006fa01843ec libart.so`art::(anonymous namespace)::InvokeWithArgArray(art::ScopedObjectAccessAlreadyRunnable const&, art::ArtMethod*, art::(anonymous namespace)::ArgArray*, art::JValue*, char const*) + 108
    frame #3: 0x0000006fa01850a8 libart.so`art::InvokeWithJValues(art::ScopedObjectAccessAlreadyRunnable const&, _jobject*, _jmethodID*, jvalue*) + 412
    frame #4: 0x0000006fa006d4ac libart.so`art::JNI::CallStaticObjectMethodA(_JNIEnv*, _jclass*, _jmethodID*, jvalue*) + 640
    frame #5: 0x0000006fa021e808 libart.so`art::InvokeProxyInvocationHandler(art::ScopedObjectAccessAlreadyRunnable&, char const*, _jobject*, _jobject*, std::__1::vector<jvalue, std::__1::allocator<jvalue> >&) + 608
    frame #6: 0x0000006fa023d8ac libart.so`artQuickProxyInvokeHandler + 1000
    frame #7: 0x0000006fa0292170 libart.so`art_quick_proxy_invoke_handler + 80

查看栈帧

使用frame n命令,n表示要查看的第几层栈帧

(lldb) frame 0
frame #0: 0x00000071b32e84f4 libsample.so`sample_test_dlsym(filename="", symbol="", debug_symbol=true, cache=0x0000007fc926aa50, try_force_dlopen=false) at sample.c:70:6

查看函数入参和函数内变量

使用frame variable命令,缩写fr v,类似gdb中info args+info locals

 (lldb) frame variable
//函数入参
(const char *) filename = 0x00000071b32e7d70 ""
(const char *) symbol = 0x00000071b32e7c32 ""
(bool) debug_symbol = true
(void **) cache = 0x0000007fc926aa50
(bool) try_force_dlopen = false
//函数局部变量
(int *) a = 0x0000000000000000
(xdl_info_t) info = {
  dli_fname = 0x0000007fc926a9f0 "\x80\xaa&\xc9\U0000007f"
  dli_fbase = 0x00000071b32e84a0
  dli_sname = 0xb40000725ec2a010 ""
  dli_saddr = 0xb40000725ec2a010
  dli_ssize = 9
  dlpi_phdr = NULL
  dlpi_phnum = 488337475956
}
(void *) handle = 0x0000000000000000
(size_t) symbol_size = 1721216442352843089
(void *) symbol_addr = 0x00000071b32e8974
(void *) linker_handle = 0x00000074e00380ec

查看函数局部变量,使用frame variable --no-args,缩写fr v -a,类似gdb info locals命令

 (lldb) frame variable --no- args
(int *) a = 0x0000000000000000
(xdl_info_t) info = {
  dli_fname = 0x0000007fc926a9f0 "\x80\xaa&\xc9\U0000007f"
  dli_fbase = 0x00000071b32e84a0
  dli_sname = 0xb40000725ec2a010 ""
  dli_saddr = 0xb40000725ec2a010
  dli_ssize = 9
  dlpi_phdr = NULL
  dlpi_phnum = 488337475956
}
(void *) handle = 0x0000000000000000
(size_t) symbol_size = 1721216442352843089
(void *) symbol_addr = 0x00000071b32e8974
(void *) linker_handle = 0x00000074e00380ec

查看函数汇编

使用disassemble命令,缩写dis

 (lldb) dis
libsample.so`sample_test_dlsym:
    0x71b32e84ac <+0>:    sub    sp, sp, #0x1d0
    0x71b32e84b0 <+4>:    stp    x29, x30, [sp, #0x1b0]
    0x71b32e84b4 <+8>:    str    x28, [sp, #0x1c0]
    0x71b32e84b8 <+12>:   add    x29, sp, #0x1b0
    0x71b32e84bc <+16>:   mrs    x8, TPIDR_EL0
    0x71b32e84c0 <+20>:   ldr    x8, [x8, #0x28]
    0x71b32e84c4 <+24>:   stur   x8, [x29, #-0x8]
    0x71b32e84c8 <+28>:   stur   x0, [x29, #-0xb0]
    0x71b32e84cc <+32>:   stur   x1, [x29, #-0xb8]
    0x71b32e84d0 <+36>:   and    w8, w2, #0x1
    0x71b32e84d4 <+40>:   sturb  w8, [x29, #-0xbc]
    0x71b32e84d8 <+44>:   stur   x3, [x29, #-0xc8]
    0x71b32e84dc <+48>:   and    w8, w4, #0x1
    0x71b32e84e0 <+52>:   sturb  w8, [x29, #-0xcc]
    0x71b32e84e4 <+56>:   mov    x8, xzr
    0x71b32e84e8 <+60>:   str    x8, [sp, #0xd8]
    0x71b32e84ec <+64>:   ldr    x9, [sp, #0xd8]
    0x71b32e84f0 <+68>:   mov    w8, #0x9
->  0x71b32e84f4 <+72>:   str    w8, [x9]
    0x71b32e84f8 <+76>:   ldurb  w8, [x29, #-0xcc]
    0x71b32e84fc <+80>:   tbz    w8, #0x0, 0x1550          ; <+164> at sample.c:80:3
    0x71b32e8500 <+84>:   b      0x1504                    ; <+88> at sample.c:75:34

可以使用-n+函数名打印对应函数汇编

(lldb) disassemble -n event_base_new
libsscronet.so`event_base_new:
    0x6f76dbb484 <+0>:   stp    x22, x21, [sp, #-0x30]!
    0x6f76dbb488 <+4>:   stp    x20, x19, [sp, #0x10]
    0x6f76dbb48c <+8>:   stp    x29, x30, [sp, #0x20]
    0x6f76dbb490 <+12>:  add    x29, sp, #0x20
    0x6f76dbb494 <+16>:  mov    w0, #0x1
    0x6f76dbb498 <+20>:  mov    w1, #0x628
    0x6f76dbb49c <+24>:  bl     0x6f76c22770              ; __wrap_calloc
    0x6f76dbb4a0 <+28>:  mov    x19, x0
    0x6f76dbb4a4 <+32>:  cbnz   x0, 0x6f76dbb4c0          ; <+60>

可以使用-a+地址打印对应函数汇编

(lldb) disassemble -a 0x6f76dbb560
libsscronet.so`event_base_new:
    0x6f76dbb484 <+0>:   stp    x22, x21, [sp, #-0x30]!
    0x6f76dbb488 <+4>:   stp    x20, x19, [sp, #0x10]
    0x6f76dbb48c <+8>:   stp    x29, x30, [sp, #0x20]
    0x6f76dbb490 <+12>:  add    x29, sp, #0x20
    0x6f76dbb494 <+16>:  mov    w0, #0x1
    0x6f76dbb498 <+20>:  mov    w1, #0x628

读内存,打印对应函数汇编

(lldb) memory read/128gx 0x0000005aedef0d00
0x5aedef0d00: 0x0000005aede76e78 0x0000005aede77398
0x5aedef0d10: 0x0000005aede4c840 0x0000005aede4c8a0
0x5aedef0d20: 0x0000005aede4c914 0x0000000000000000
0x5aedef0d30: 0x0000005aede4c9c4 0x0000005aede5df4c
0x5aedef0d40: 0x0000005aede4ca0c 0x0000000000000000

(lldb) disass -s 0x5aede76e78
ld-musl-aarch64.so.1`mmap64:
    0x5aede76e78 <+0>:  stp    x29, x30, [sp, #-0x50]!
    0x5aede76e7c <+4>:  str    x25, [sp, #0x10]
    0x5aede76e80 <+8>:  stp    x24, x23, [sp, #0x20]
    0x5aede76e84 <+12>: stp    x22, x21, [sp, #0x30]
    0x5aede76e88 <+16>: stp    x20, x19, [sp, #0x40]
    0x5aede76e8c <+20>: mov    x29, sp
    0x5aede76e90 <+24>: tst    x5, #0xfff
    0x5aede76e94 <+28>: b.ne   0x5aede76f44              ; <+204>

(lldb) disass -s 5aede77398
ld-musl-aarch64.so.1`__munmap:
    0x5aede77398 <+0>:  stp    x29, x30, [sp, #-0x30]!
    0x5aede7739c <+4>:  str    x21, [sp, #0x10]
    0x5aede773a0 <+8>:  stp    x20, x19, [sp, #0x20]
    0x5aede773a4 <+12>: mov    x29, sp
    0x5aede773a8 <+16>: adrp   x8, 649
    0x5aede773ac <+20>: mov    x19, x1
    0x5aede773b0 <+24>: mov    x20, x0
    0x5aede773b4 <+28>: ldr    w2, [x8, #0x2c]

(lldb) disass -s 0x5aede77398
ld-musl-aarch64.so.1`__munmap:
    0x5aede77398 <+0>:  stp    x29, x30, [sp, #-0x30]!
    0x5aede7739c <+4>:  str    x21, [sp, #0x10]
    0x5aede773a0 <+8>:  stp    x20, x19, [sp, #0x20]
    0x5aede773a4 <+12>: mov    x29, sp
    0x5aede773a8 <+16>: adrp   x8, 649
    0x5aede773ac <+20>: mov    x19, x1
    0x5aede773b0 <+24>: mov    x20, x0
    0x5aede773b4 <+28>: ldr    w2, [x8, #0x2c]

(lldb) disass -s 0x0000005aede4c840
ld-musl-aarch64.so.1`libc_gwp_asan_malloc:
    0x5aede4c840 <+0>:  stp    x29, x30, [sp, #-0x20]!
    0x5aede4c844 <+4>:  str    x19, [sp, #0x10]
    0x5aede4c848 <+8>:  mov    x29, sp
    0x5aede4c84c <+12>: adrp   x8, 690
    0x5aede4c850 <+16>: mov    x19, x0
    0x5aede4c854 <+20>: ldrb   w8, [x8, #0x370]
    0x5aede4c858 <+24>: cmp    w8, #0x1
    0x5aede4c85c <+28>: b.eq   0x5aede4c870              ; <+48>

(lldb) disass -s 0x0000005aede4c8a0
ld-musl-aarch64.so.1`libc_gwp_asan_calloc:
    0x5aede4c8a0 <+0>:  stp    x29, x30, [sp, #-0x20]!
    0x5aede4c8a4 <+4>:  stp    x20, x19, [sp, #0x10]
    0x5aede4c8a8 <+8>:  mov    x29, sp
    0x5aede4c8ac <+12>: adrp   x8, 690
    0x5aede4c8b0 <+16>: mov    x19, x1
    0x5aede4c8b4 <+20>: mov    x20, x0
    0x5aede4c8b8 <+24>: ldrb   w8, [x8, #0x370]
    0x5aede4c8bc <+28>: cmp    w8, #0x1

(lldb) disass -s 0x0000005aede4c914
ld-musl-aarch64.so.1`libc_gwp_asan_realloc:
    0x5aede4c914 <+0>:  sub    sp, sp, #0x30
    0x5aede4c918 <+4>:  stp    x29, x30, [sp, #0x10]
    0x5aede4c91c <+8>:  stp    x20, x19, [sp, #0x20]
    0x5aede4c920 <+12>: add    x29, sp, #0x10
    0x5aede4c924 <+16>: adrp   x8, 690
    0x5aede4c928 <+20>: ldrb   w8, [x8, #0x370]
    0x5aede4c92c <+24>: tbnz   w8, #0x0, 0x5aede4c940    ; <+44>
    0x5aede4c930 <+28>: ldp    x20, x19, [sp, #0x20]

(lldb) disass -s 0x0000005aede4c9c4
ld-musl-aarch64.so.1`libc_gwp_asan_free:
    0x5aede4c9c4 <+0>:  stp    x29, x30, [sp, #-0x20]!
    0x5aede4c9c8 <+4>:  str    x19, [sp, #0x10]
    0x5aede4c9cc <+8>:  mov    x29, sp
    0x5aede4c9d0 <+12>: adrp   x8, 690
    0x5aede4c9d4 <+16>: ldrb   w8, [x8, #0x370]
    0x5aede4c9d8 <+20>: tbnz   w8, #0x0, 0x5aede4c9e8    ; <+36>
    0x5aede4c9dc <+24>: ldr    x19, [sp, #0x10]
    0x5aede4c9e0 <+28>: ldp    x29, x30, [sp], #0x20

相关命令

(lldb) disassemble --frame

(lldb) di -f

(lldb) disassemble --name main

(lldb) di -n main

(lldb) disassemble --start-address 0x1eb8 --end-address 0x1ec3

(lldb) di -s 0x1eb8 -e 0x1ec3

(lldb) disassemble --start-address 0x1eb8 --count 20

(lldb) di -s 0x1eb8 -c 20

查看寄存器信息

register read

(lldb) register read
General Purpose Registers:
        x0 = 0x00000071b32e7d70  
        x1 = 0x00000071b32e7c32  
        x2 = 0x0000000000000001
        x3 = 0x0000007fc926aa50
        x4 = 0x0000000000000000
        x5 = 0x0000000000008a98
        x6 = 0x2c2c2c2c2c2c2c2c
        x7 = 0x7f7f7f7f7f7f7f7f
        x8 = 0x0000000000000009
        x9 = 0x0000000000000000
       x10 = 0x00000000000003e8
       x11 = 0x17e2fd3c2400b951
       x12 = 0x0000007fc9269220
       x13 = 0x0000000000000043
       x14 = 0x0000007fc926a568
       x15 = 0x00000000c939641a
       x16 = 0x00000074cb5413c8
       x17 = 0x00000074cb51e3f0  libc.so`nanosleep
       x18 = 0x00000074ee83a000
       x19 = 0xb40000725ec2a010
       x20 = 0x0000000000000000
       x21 = 0xb40000725ec2a0d8
       x22 = 0xb40000725ec2a0c0
       x23 = 0x0000007fc926ac30
       x24 = 0x0000000000000000
       x25 = 0x0000007fc926ac70
       x26 = 0x00000074d82ac188
       x27 = 0xb40000725ec2a010
       x28 = 0x0000007fc926aa80
        fp = 0x0000007fc926a9e0
        lr = 0x00000071b32e8198  libsample.so`sample_test + 88 at sample.c:140:3
        sp = 0x0000007fc926a830
        pc = 0x00000071b32e84f4  libsample.so`sample_test_dlsym + 72 at sample.c:70:6
      cpsr = 0x60001000

打印变量

p:输出值+值类型+引用名+内存地址

po:输出值

打印结构体变量
(lldb) p info
(xdl_info_t) $2 = {
  dli_fname = 0x0000007fc926a9f0 "\x80\xaa&\xc9\U0000007f"
  dli_fbase = 0x00000071b32e84a0
  dli_sname = 0xb40000725ec2a010 ""
  dli_saddr = 0xb40000725ec2a010
  dli_ssize = 9
  dlpi_phdr = NULL
  dlpi_phnum = 488337475956
}

(lldb) p/x info
(xdl_info_t) $3 = {
  dli_fname = 0x0000007fc926a9f0 "\x80\xaa&\xc9\U0000007f"
  dli_fbase = 0x00000071b32e84a0
  dli_sname = 0xb40000725ec2a010 ""
  dli_saddr = 0xb40000725ec2a010
  dli_ssize = 0x0000000000000009
  dlpi_phdr = NULL
  dlpi_phnum = 0x00000071b32e8974
}

//打印某个寄存器值
(lldb) p/x $ sp
(unsigned long) $4 = 0x0000007fc926a830

读取内存

memory read命令

 (lldb) memory read 0x0000007fc926a830
0x7fc926a830: 50 12 31 b3 71 00 00 00 28 a9 26 c9 7f 00 00 00  P.1.q...(.&.....
0x7fc926a840: 00 70 2e b3 71 00 00 00 00 32 9e ec 74 00 00 00  .p..q....2..t...

(lldb) memory read/ 4 gx 0x0000007fc926a830
0x7fc926a830: 0x00000071b3311250 0x0000007fc926a928
0x7fc926a840: 0x00000071b32e7000 0x00000074ec9e3200

缩写x +地址或变量

 (lldb) x 0x0000007fc926a830
0x7fc926a830: 50 12 31 b3 71 00 00 00 28 a9 26 c9 7f 00 00 00  P.1.q...(.&.....
0x7fc926a840: 00 70 2e b3 71 00 00 00 00 32 9e ec 74 00 00 00  .p..q....2..t...

(lldb) x/ 4 gx 0x0000007fc926a830
0x7fc926a830: 0x00000071b3311250 0x0000007fc926a928
0x7fc926a840: 0x00000071b32e7000 0x00000074ec9e3200

//memory read --size 8 --format x --count 8 0x7fc926a830
(lldb) x -s8 -fx -c8 0x7fc926a830 
0x7fc926a830: 0x00000071b3311250 0x0000007fc926a928
0x7fc926a840: 0x00000071b32e7000 0x00000074ec9e3200
0x7fc926a850: 0x00000071b32e7040 0x0000000000000009
0x7fc926a860: 0x0000000000000146 0x0000000000000000

说明:

x是读取内存的命令,x/4gx中第一个x是读取内存命令,后面的g是每次读取8字节,x的意思是16进制显示结果,4表示连续打印4段。

对于g,常用的大小格式为b对应byte 1字节,h对应half word 2字节,w对应word 4字节,g对应giant word 8字节

对于x,我们还可以用o对应8机制,b对应2进制,x对应16进制,f对应浮点,d对应10进制

查看线程信息

 (lldb) thread info
thread #1: tid = 4786, 0x00000071b32e84f4 libsample.so`sample_test_dlsym(filename="", symbol="", debug_symbol=true, cache=0x0000007fc926aa50, try_force_dlopen=false) at sample.c:70:6, name = 'king.xdl.sample', stop reason = signal SIGSEGV

切换线程

(lldb) thread select n
(lldb) t x

查看线程列表

 (lldb) thread list
Process 4786 stopped
* thread #1: tid = 4786, 0x00000071b32e84f4 libsample.so`sample_test_dlsym(filename="", symbol="", debug_symbol=true, cache=0x0000007fc926aa50, try_force_dlopen=false) at sample.c:70:6, name = 'king.xdl.sample', stop reason = signal SIGSEGV
  thread #2: tid = 4800, 0x00000074cb51dc78 libc.so`__ioctl at syscalls-arm64.S:799, stop reason = signal 0
  thread #3: tid = 4797, 0x00000074cb4c123c libc.so`syscall at syscall.S:41, stop reason = signal 0
  thread #4: tid = 4805, 0x00000074cb51ec38 libc.so`__epoll_pwait at syscalls-arm64.S:2370, stop reason = signal 0
  thread #5: tid = 4825, 0x00000074cb51ec38 libc.so`__epoll_pwait at syscalls-arm64.S:2370, stop reason = signal 0
  thread #6: tid = 4824, 0x00000074cb4c123c libc.so`syscall at syscall.S:41, stop reason = signal 0
  thread #7: tid = 4811, 0x00000074cb51ed34 libc.so`__ppoll at syscalls-arm64.S:2469, stop reason = signal 0
  thread #8: tid = 4847, 0x00000074cb51e3f4 libc.so`nanosleep at syscalls-arm64.S:1550, stop reason = signal 0
  thread #9: tid = 4798, 0x00000074cb4c123c libc.so`syscall at syscall.S:41, stop reason = signal 0
  thread #10: tid = 4837, 0x00000074cb4c123c libc.so`syscall at syscall.S:41, stop reason = signal 0
  thread #11: tid = 4819, 0x00000074cb4c123c libc.so`syscall at syscall.S:41, stop reason = signal 0
  thread #12: tid = 4843, 0x00000074cb51dc78 libc.so`__ioctl at syscalls-arm64.S:799, stop reason = signal 0
  thread #13: tid = 4793, 0x00000074cb51ed34 libc.so`__ppoll at syscalls-arm64.S:2469, stop reason = signal 0
  thread #14: tid = 4791, 0x00000074cb51e658 libc.so`__rt_sigtimedwait at syscalls-arm64.S:1790, stop reason = signal 0
  thread #15: tid = 4820, 0x00000074cb4c123c libc.so`syscall at syscall.S:41, stop reason = signal 0
  thread #16: tid = 4801, 0x00000074cb51dc78 libc.so`__ioctl at syscalls-arm64.S:799, stop reason = signal 0
  thread #17: tid = 4792, 0x00000074cb51d954 libc.so`read at syscalls-arm64.S:486, stop reason = signal 0
  thread #18: tid = 4794, 0x00000074cb4c123c libc.so`syscall at syscall.S:41, stop reason = signal 0
  thread #19: tid = 4799, 0x000000722b3e1a84 libart.so`art::EnsureInitialized(self=0xb40000725ec5c6a0, shadow_frame=0x00000071b82d8020) at common_dex_operations.h:63, stop reason = signal 0
  thread #20: tid = 4796, 0x00000074cb4c123c libc.so`syscall at syscall.S:41, stop reason = signal 0
  thread #21: tid = 4803, 0x00000074cb4c123c libc.so`syscall at syscall.S:41, stop reason = signal 0
  thread #22: tid = 4812, 0x00000074cb4c123c libc.so`syscall at syscall.S:41, stop reason = signal 0
  thread #23: tid = 4855, 0x00000074cb51dc78 libc.so`__ioctl at syscalls-arm64.S:799, stop reason = signal 0
  thread #24: tid = 4822, 0x00000074cb51ec38 libc.so`__epoll_pwait at syscalls-arm64.S:2370, stop reason = signal 0
  thread #25: tid = 4795, 0x00000074cb4c123c libc.so`syscall at syscall.S:41, stop reason = signal 0

常量的进制转换

//默认打印为10进制
(lldb) p 100
(int) $7 = 100

//转16进制
(lldb) p/x 100
(int) $8 = 0x00000064

//转8进制
(lldb) p/o 100
(int) $9 = 0144

//转二进制
(lldb) p/t 100
(int) $10 = 0b00000000000000000000000001100100

//字符转10进制数字
(lldb) p/d 'a'
(char) $11 = 97

//10进制数字转字符
(lldb) p/c 97
(int) $12 = a\0\0\0

查看指定so中的符号表

image dump symfile <index/so_file>:打印指定模块中的符号列表

(lldb) image dump symfile /Users/pang/.lldb/module_cache/remote-ohos/.cache/BA282D4E-0C9A-DD4F-48AA-3FF367D51FC7/ld-musl-aarch64.so.1 


SymbolFile symtab (/Users/pang/.lldb/module_cache/remote-ohos/.cache/BA282D4E-0C9A-DD4F-48AA-3FF367D51FC7/ld-musl-aarch64.so.1)
Types:

Compile units:

Symtab, file = /Users/pang/.lldb/module_cache/remote-ohos/.cache/BA282D4E-0C9A-DD4F-48AA-3FF367D51FC7/ld-musl-aarch64.so.1, num_symbols = 4073:
               Debug symbol
               |Synthetic symbol
               ||Externally Visible
               |||
Index   UserID DSX Type            File Address/Value Load Address       Size               Flags      Name
------- ------ --- --------------- ------------------ ------------------ ------------------ ---------- ----------------------------------
[    0]      1     Data            0x00000000001ee7e0                    0x0000000000000008 0x00000001 _dlstart_c.static_func_ptr
[    1]      2     Code            0x000000000009051c                    0x000000000000025c 0x00000202 _dlstart_c
[    2]      3     Code            0x000000000009ad2c                    0x0000000000000138 0x00000002 check_verinfo
[    3]      4     Code            0x0000000000090cac                    0x0000000000000210 0x00000002 do_init_fini
[    4]      5     Code            0x0000000000090ebc                    0x0000000000000004 0x00000002 dl_debug_state
[    5]      6     Code            0x00000000000911c4                    0x00000000000001c4 0x00000002 kernel_mapped_dso
[    6]      7     Code            0x0000000000091388                    0x00000000000002d0 0x00000002 decode_dyn
[    7]      8     Code            0x0000000000091658                    0x00000000000007c0 0x00000002 reloc_all
[    8]      9     Code            0x000000000009bd78                    0x0000000000000360 0x00000002 find_sym2
[    9]     10     Code            0x000000000009ae64                    0x000000000000098c 0x00000002 do_relocs
[   10]     11     Code            0x000000000009b7f0                    0x0000000000000588 0x00000002 do_android_relocs
[   11]     12     Code            0x0000000000093a38                    0x00000000000000e8 0x00000002 error_impl
[   12]     13     Code            0x0000000000093b20                    0x0000000000000164 0x00000002 reclaim_gaps
[   13]     14     Code            0x0000000000093c84                    0x0000000000000160 0x00000002 find_and_set_bss_name
[   14]     15     Code            0x000000000009c5b4                    0x00000000000000d4 0x00000002 set_ns_attrs
......
[ 1959]   1960     Code            0x000000000014b840                    0x0000000000000060 0x00000002 libc_gwp_asan_malloc
[ 1960]   1961     Code            0x000000000015cf4c                    0x0000000000000004 0x00000002 __libc_aligned_alloc
[ 1961]   1962     Code            0x000000000014b9c4                    0x0000000000000048 0x00000002 libc_gwp_asan_free
[ 1962]   1963     Code            0x0000000000175e78                    0x0000000000000158 0x00000002 __libc_mmap
[ 1963]   1964     Code            0x0000000000176398                    0x00000000000000b8 0x00000002 __libc_munmap
[ 1964]   1965     Code            0x000000000014b8a0                    0x0000000000000074 0x00000002 libc_gwp_asan_calloc
[ 1965]   1966     Code            0x000000000014b914                    0x00000000000000b0 0x00000002 libc_gwp_asan_realloc
[ 1966]   1967     Code            0x000000000014ba0c                    0x0000000000000048 0x00000002 libc_gwp_asan_malloc_usable_size
[ 1967]   1968     Code            0x0000000000154400                    0x00000000000001d8 0x00000002 __libc_prctl
[ 1968]   1969     Code            0x000000000014e210                    0x0000000000000160 0x00000202 HiLogAdapterPrint
[ 1969]   1970     Code            0x000000000015d8cc                    0x0000000000000004 0x00000002 __libc_malloc_usable_size
[ 1970]   1971     Code            0x0000000000182fac                    0x00000000000002cc 0x00000002 __libc_socket
[ 1971]   1972     Code            0x000000000015d0d0                    0x00000000000002a8 0x00000202 __libc_free
[ 1972]   1973     Code            0x00000000001c8aa4                    0x000000000000032c 0x00000002 trace_marker_end
[ 1973]   1974     Data            0x00000000001efb64                    0x0000000000000004 0x00000201 __default_stacksize
[ 1974]   1975     Code            0x000000000015f638                    0x0000000000000004 0x00000202 __libc_malloc
[ 1975]   1976     Code            0x000000000015ef1c                    0x00000000000004a8 0x00000202 __libc_realloc
......
[ 2788]   2790   X Data            0x0000000000409350                    0x0000000000000178 0x00000011 __musl_libc_globals
......
[ 2825]   2827   X Data            0x00000000001efd00                    0x00000000000000b0 0x00000011 __libc_malloc_default_dispatch

查找指定符号在那个so

 (lldb) image lookup -n mallinfo
1 match found in /Users/pang/.lldb/module_cache/remote-ohos/.cache/BA282D4E-0C9A-DD4F-48AA-3FF367D51FC7/ld-musl-aarch64.so.1:
        Address: ld-musl-aarch64.so .1 [ 0x00000000001c95a4 ] (ld-musl-aarch64.so.1.PT_LOAD[1]..text + 1282212)
        Summary: ld-musl-aarch64.so.1`mallinfo

(lldb) image lookup -n je_mallinfo
1 match found in /Users/pang/.lldb/module_cache/remote-ohos/.cache/BA282D4E-0C9A-DD4F-48AA-3FF367D51FC7/ld-musl-aarch64.so.1:
        Address: ld-musl-aarch64.so .1 [ 0x00000000000c5dc8 ] (ld-musl-aarch64.so.1.PT_LOAD[1]..text + 219336)
        Summary: ld-musl-aarch64.so.1`je_mallinfo
readelf查看对应地址
    entry 311 {
      initial_location: 0xc5dc8
      address: 0x6efb8
    }
dwarf信息
  [0x6efb8] FDE length=44 cie=[0x6b558]
    initial_location: 0xc5dc8
    address_range: 0x3a8 (end : 0xc6170)

Program:
  DW_CFA_advance_loc: 4
  DW_CFA_def_cfa_offset: +112
  DW_CFA_advance_loc: 28
  DW_CFA_def_cfa: reg29 +96
  DW_CFA_offset: reg19 -8
  DW_CFA_offset: reg20 -16
  DW_CFA_offset: reg21 -24
  DW_CFA_offset: reg22 -32
  DW_CFA_offset: reg23 -40
  DW_CFA_offset: reg24 -48
  DW_CFA_offset: reg25 -56
  DW_CFA_offset: reg26 -64
  DW_CFA_offset: reg27 -72
  DW_CFA_offset: reg28 -80
  DW_CFA_offset: reg30 -88
  DW_CFA_offset: reg29 -96
  
objdump查看对应汇编
   c5dc8: ff c3 01 d1                   sub sp, sp, #112
   c5dcc: fd 7b 01 a9                   stp x29, x30, [sp, #16]
   c5dd0: fc 6f 02 a9                   stp x28, x27, [sp, #32]
   c5dd4: fa 67 03 a9                   stp x26, x25, [sp, #48]
   c5dd8: f8 5f 04 a9                   stp x24, x23, [sp, #64]
   c5ddc: f6 57 05 a9                   stp x22, x21, [sp, #80]
   c5de0: f4 4f 06 a9                   stp x20, x19, [sp, #96]
   c5de4: fd 43 00 91                   add x29, sp, #16
   c5de8: 00 e4 00 6f                   movi  v0.2d, #0000000000000000
   c5dec: a0 09 00 90                   adrp  x0, #1261568
   c5df0: 00 e0 29 91                   add x0, x0, #2680
   c5df4: f3 03 08 aa                   mov x19, x8
   c5df8: 00 81 00 ad                   stp q0, q0, [x8, #16]
   c5dfc: 00 81 01 ad                   stp q0, q0, [x8, #48]
   c5e00: 00 01 80 3d                   str q0, [x8]
   c5e04: 77 d8 03 94                   bl  #1008092 <pthread_mutex_trylock>
   c5e08: a0 19 00 35                   cbnz  w0, #820 <strncpy+0x21138>
   c5e0c: a8 09 00 90                   adrp  x8, #1261568
   c5e10: 08 a1 29 91                   add x8, x8, #2664        

查看某地址在那个so中

image lookup -a 0x0000005aee10a350

(lldb) image lookup -a 0x0000005aee10a350
      Address: ld-musl-aarch64.so.1[0x0000000000409350] (ld-musl-aarch64.so.1.PT_LOAD[3]..bss + 2200912)
      Summary: ld-musl-aarch64.so.1`__musl_libc_globals

查看某地址在哪块maps中

memory region addr

(lldb) memory region 0x0000006f97d28638
[0x0000006f97c01000-0x0000006f97e00000) rw-

参考文档

lldb.llvm.org/use/variabl… juejin.cn/post/687276…