simpleperf+Flutter:如何在`--split debug-info`时符号化libapp.so



我使用--profile将Flutter应用程序编译为apk文件,使其处于配置文件模式,还使用--split-debug-info,因为我想测试何时拆分调试信息。然后我使用simpleperf从中获取数据:

cp /.../build/split-debug-info/app.android-arm64.symbols /Users/tom/temp/20220312_symbols/libapp.so && $SPDIR/app_profiler.py -p com.myapp -lib /Users/tom/temp/20220312_symbols

然后我得到报告:

(base) ➜  temp $SPDIR/report.py | head -n 20         
Cmdline: /data/data/com.cjy.yplusplus/simpleperf record --app com.cjy.yplusplus --in-app --tracepoint-events /data/local/tmp/tracepoint_events --out-fd 3 --stop-signal-fd 4 -e task-clock:u -f 1000 -g --duration 10 --symfs /data/local/tmp/native_libs/
Arch: arm64
Event: task-clock:u (type 1, config 1)
Samples: 2751
Event count: 2751000000
Overhead  Command            Pid    Tid    Shared Object                                                                 Symbol
35.55%    1.ui               11557  11585  /data/app/com.cjy.yplusplus-nKS0Krl0LnESZxSFCneDAw==/lib/arm64/libapp.so      libapp.so[+17cc8d8]
15.38%    1.ui               11557  11585  /data/app/com.cjy.yplusplus-nKS0Krl0LnESZxSFCneDAw==/lib/arm64/libapp.so      libapp.so[+17cc8c0]
8.14%     1.ui               11557  11585  /data/app/com.cjy.yplusplus-nKS0Krl0LnESZxSFCneDAw==/lib/arm64/libapp.so      libapp.so[+17cc8dc]
7.60%     1.ui               11557  11585  /data/app/com.cjy.yplusplus-nKS0Krl0LnESZxSFCneDAw==/lib/arm64/libapp.so      libapp.so[+17cc8b4]
4.65%     1.ui               11557  11585  /data/app/com.cjy.yplusplus-nKS0Krl0LnESZxSFCneDAw==/lib/arm64/libapp.so      libapp.so[+17cc8f4]
4.07%     1.ui               11557  11585  /data/app/com.cjy.yplusplus-nKS0Krl0LnESZxSFCneDAw==/lib/arm64/libapp.so      libapp.so[+17cc8d4]
4.03%     1.ui               11557  11585  /data/app/com.cjy.yplusplus-nKS0Krl0LnESZxSFCneDAw==/lib/arm64/libapp.so      libapp.so[+17cc8bc]
4.03%     1.ui               11557  11585  /data/app/com.cjy.yplusplus-nKS0Krl0LnESZxSFCneDAw==/lib/arm64/libapp.so      libapp.so[+17cc8d0]
3.85%     1.ui               11557  11585  /data/app/com.cjy.yplusplus-nKS0Krl0LnESZxSFCneDAw==/lib/arm64/libapp.so      libapp.so[+17cc8c8]
3.82%     1.ui               11557  11585  /data/app/com.cjy.yplusplus-nKS0Krl0LnESZxSFCneDAw==/lib/arm64/libapp.so      libapp.so[+17cc8e4]
3.45%     1.ui               11557  11585  /data/app/com.cjy.yplusplus-nKS0Krl0LnESZxSFCneDAw==/lib/arm64/libapp.so      libapp.so[+17cc8c4]
3.05%     1.ui               11557  11585  /data/app/com.cjy.yplusplus-nKS0Krl0LnESZxSFCneDAw==/lib/arm64/libapp.so      libapp.so[+17cc8b0]
0.15%     1.ui               11557  11585  /data/app/com.cjy.yplusplus-nKS0Krl0LnESZxSFCneDAw==/lib/arm64/libflutter.so  fmod

然而,正如你所看到的,这个符号并不是象征性的。这只是一个地址。

我尝试手动使用addr2line,但失败了:

addr2line -f -e /Users/tom/temp/20220312_symbols/libapp.so 0x17cc8d8
??
??:0

而且,我还检查了捆绑在.apk文件中的libapp.so

unzip -p /.../build/app/outputs/flutter-apk/app-profile.apk lib/arm64-v8a/libapp.so > /Users/tom/temp/from_apk_libapp.so
objdump -h /Users/tom/temp/from_apk_libapp.so        
/Users/tom/temp/from_apk_libapp.so:     file format elf64-littleaarch64
Sections:
Idx Name          Size      VMA               LMA               File off  Algn
0 .note.gnu.build-id 00000020  0000000000000190  0000000000000190  00000190  2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
1 .rodata       0062c990  00000000000001b0  00000000000001b0  000001b0  2**4
CONTENTS, ALLOC, LOAD, READONLY, DATA
2 .eh_frame     00000048  000000000062cb40  000000000062cb40  0062cb40  2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
3 .dynsym       00000090  000000000062cc10  000000000062cc10  0062cc10  2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
4 .dynstr       00000085  000000000062cb88  000000000062cb88  0062cb88  2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
5 .hash         00000038  000000000062cca0  000000000062cca0  0062cca0  2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
6 .text         00b81910  0000000000630000  0000000000630000  00630000  2**4
CONTENTS, ALLOC, LOAD, READONLY, CODE
7 .bss          00000018  00000000011b4000  00000000011b4000  011b4000  2**3
CONTENTS, ALLOC, LOAD, DATA
8 .dynamic      00000060  00000000011b4018  00000000011b4018  011b4018  2**3
CONTENTS, ALLOC, LOAD, DATA

更多信息(objdump-D(如果你喜欢:

objdump -D /Users/tom/temp/from_apk_libapp.so > 1b.txt
/Users/tom/temp/from_apk_libapp.so:     file format elf64-littleaarch64
...
// near end of file
11b18a8:   d1014529    sub x9, x9, #0x51
11b18ac:   f100093f    cmp x9, #0x2
11b18b0:   54000269    b.ls    11b18fc <_kDartIsolateSnapshotInstructions+0xb7c7bc>  // b.plast
11b18b4:   d1006529    sub x9, x9, #0x19
11b18b8:   f100a53f    cmp x9, #0x29
11b18bc:   54000209    b.ls    11b18fc <_kDartIsolateSnapshotInstructions+0xb7c7bc>  // b.plast
11b18c0:   f1203929    subs    x9, x9, #0x80e
11b18c4:   540001c0    b.eq    11b18fc <_kDartIsolateSnapshotInstructions+0xb7c7bc>  // b.none
11b18c8:   d103d929    sub x9, x9, #0xf6
11b18cc:   f100053f    cmp x9, #0x1
11b18d0:   54000169    b.ls    11b18fc <_kDartIsolateSnapshotInstructions+0xb7c7bc>  // b.plast
11b18d4:   928247f1    mov x17, #0xffffffffffffedc0        // #-4672
11b18d8:   ab110129    adds    x9, x9, x17
11b18dc:   54000100    b.eq    11b18fc <_kDartIsolateSnapshotInstructions+0xb7c7bc>  // b.none
11b18e0:   f104e929    subs    x9, x9, #0x13a
11b18e4:   540000c0    b.eq    11b18fc <_kDartIsolateSnapshotInstructions+0xb7c7bc>  // b.none
11b18e8:   d1083529    sub x9, x9, #0x20d
11b18ec:   f100393f    cmp x9, #0xe
11b18f0:   54000069    b.ls    11b18fc <_kDartIsolateSnapshotInstructions+0xb7c7bc>  // b.plast
11b18f4:   f10bf129    subs    x9, x9, #0x2fc
11b18f8:   54000041    b.ne    11b1900 <_kDartIsolateSnapshotInstructions+0xb7c7c0>  // b.any
11b18fc:   d65f03c0    ret
11b1900:   f9414350    ldr x16, [x26, #640]
11b1904:   d61f0200    br  x16
11b1908:   d4200000    brk #0x0
11b190c:   d4200000    brk #0x0
Disassembly of section .bss:
00000000011b4000 <.bss>:
...
Disassembly of section .dynamic:
00000000011b4018 <.dynamic>:
11b4018:   00000004    udf #4
11b401c:   00000000    udf #0
11b4020:   0062cca0    .inst   0x0062cca0 ; undefined
11b4024:   00000000    udf #0
11b4028:   00000005    udf #5
11b402c:   00000000    udf #0
11b4030:   0062cb88    .inst   0x0062cb88 ; undefined
11b4034:   00000000    udf #0
11b4038:   0000000a    udf #10
11b403c:   00000000    udf #0
11b4040:   00000085    udf #133
11b4044:   00000000    udf #0
11b4048:   00000006    udf #6
11b404c:   00000000    udf #0
11b4050:   0062cc10    .inst   0x0062cc10 ; undefined
11b4054:   00000000    udf #0
11b4058:   0000000b    udf #11
11b405c:   00000000    udf #0
11b4060:   00000018    udf #24
...
// end of file

正如您所看到的,最大地址大约是11b4060。但符号地址表示libapp.so[+17cc8d8],它甚至更大。所以这个符号甚至不存在于libapp.So中?

我很困惑,无法象征这些符号。感谢您的帮助!

https://github.com/flutter/flutter/issues/100008

我已经找到了可能的线索:如果没有调试符号,simpleperf似乎无法在DWARF模式下工作(尽管还没有尝试调用图模式(。

最新更新