背景:
前面文章关于CallStack的解决方法都是属于不直接使用CallStack的方式来解决,但先说明哈,是实在没有办法的情况下才会考虑非CallStack打印方案,其实在很多情况下都是可以使用这个CallStack。
因为经常报错的如下:
error: undefined symbol: android::CallStack::CallStack(char const*, int)
但是你又明明加了对应的libutilscallstack在cpp的对应目标上,还是报错找不到的话,那么很可能是结构上的依赖有问题。
下面以两个案例来说明正常使用CallStack进行编译的情况
学员案例1
需求在
frameworks/native/services/inputflinger/dispatcher/InputDispatcher.cpp
代码的openInputChannelPair进行堆栈打印
status_t openInputChannelPair(const std::string& name, std::shared_ptr<InputChannel>& serverChannel,
std::unique_ptr<InputChannel>& clientChannel) {
android::CallStack cs("INTEL-MESA");
cs.update();
cs.log("INTEL-MESA");
//省略
return result;
}
然后编译的Android.bp中进行添加相关的添加libutilscallstack库,这里正常肯定是修改哪个cpp文件,就在cpp对应的编译目标中添加,所以这里修改如下:
frameworks/native/services/inputflinger/dispatcher/Android.bp
但是编译后报错如下:
[ 86% 211/244] //frameworks/native/services/inputflinger:libinputflinger link libinputflinger.so
FAILED: out/soong/.intermediates/frameworks/native/services/inputflinger/libinputflinger/android_x86_64_shared/unstripped/libinputflinger.so
prebuilts/clang/host/linux-x86/clang-r450784d/bin/clang++ out/soong/.intermediates/bionic/libc/crtbegin_so/android_x86_64/crtbegin_so.o @out/soong/.intermediates/frameworks/native/services/inputflinger/libinputf
linger/android_x86_64_shared/unstripped/libinputflinger.so.rsp out/soong/.intermediates/external/libpalmrejection/libpalmrejection/android_x86_64_static/libpalmrejection.a out/soong/.intermediates/frameworks/nat
ive/services/inputflinger/dispatcher/libinputdispatcher/android_x86_64_static/libinputdispatcher.a out/soong/.intermediates/frameworks/native/libs/attestation/libattestation/android_x86_64_static/libattestation.
a prebuilts/clang/host/linux-x86/clang-r450784d/lib64/clang/14.0.6/lib/linux/libclang_rt.ubsan_minimal-x86_64-android.a out/soong/.intermediates/external/libcxxabi/libc++demangle/android_x86_64_static/libc++dema
ngle.a prebuilts/clang/host/linux-x86/clang-r450784d/lib64/clang/14.0.6/lib/linux/libclang_rt.builtins-x86_64-android.a out/soong/.intermediates/hardware/interfaces/input/processor/aidl/android.hardware.input.pr
ocessor-V1-ndk/android_x86_64_shared/android.hardware.input.processor-V1-ndk.so out/soong/.intermediates/system/libbase/libbase/android_x86_64_shared/libbase.so out/soong/.intermediates/frameworks/native/libs/bi
nder/libbinder/android_x86_64_shared/libbinder.so out/soong/.intermediates/frameworks/native/libs/binder/ndk/libbinder_ndk/android_x86_64_shared/libbinder_ndk.so out/soong/.intermediates/external/libchrome/libch
rome/android_x86_64_shared/libchrome.so out/soong/.intermediates/external/boringssl/libcrypto/android_x86_64_shared/libcrypto.so out/soong/.intermediates/system/core/libcutils/libcutils/android_x86_64_shared/lib
cutils.so out/soong/.intermediates/system/libhidl/libhidlbase/android_x86_64_shared/libhidlbase.so out/soong/.intermediates/frameworks/native/libs/input/libinput/android_x86_64_shared/libinput.so out/soong/.inte
rmediates/packages/modules/StatsD/lib/libkll/libkll/android_x86_64_shared/libkll.so out/soong/.intermediates/system/logging/liblog/liblog/android_x86_64_shared/liblog.so out/soong/.intermediates/external/protobu
f/libprotobuf-cpp-lite/android_x86_64_shared/libprotobuf-cpp-lite.so out/soong/.intermediates/frameworks/proto_logging/stats/stats_log_api_gen/libstatslog/android_x86_64_shared/libstatslog.so out/soong/.intermed
iates/packages/modules/StatsD/lib/libstatspull/libstatspull/android_x86_64_shared_current/libstatspull.so out/soong/.intermediates/packages/modules/StatsD/lib/libstatssocket/libstatssocket/android_x86_64_shared_
current/libstatssocket.so out/soong/.intermediates/system/core/libutils/libutils/android_x86_64_shared/libutils.so out/soong/.intermediates/frameworks/native/libs/ui/libui/android_x86_64_shared/libui.so out/soon
g/.intermediates/system/server_configurable_flags/libflags/server_configurable_flags/android_x86_64_shared/server_configurable_flags.so out/soong/.intermediates/frameworks/native/services/inputflinger/libinputfl
inger_base/android_x86_64_shared/libinputflinger_base.so out/soong/.intermediates/frameworks/native/services/inputflinger/reporter/libinputreporter/android_x86_64_shared/libinputreporter.so out/soong/.intermedia
tes/frameworks/native/services/inputflinger/reader/libinputreader/android_x86_64_shared/libinputreader.so out/soong/.intermediates/frameworks/native/libs/gui/libgui/android_x86_64_shared/libgui.so out/soong/.int
ermediates/external/libcxx/libc++/android_x86_64_shared/libc++.so out/soong/.intermediates/bionic/libc/libc/android_x86_64_shared_current/libc.so out/soong/.intermediates/bionic/libm/libm/android_x86_64_shared_c
urrent/libm.so out/soong/.intermediates/bionic/libdl/libdl/android_x86_64_shared_current/libdl.so out/soong/.intermediates/bionic/libc/crtend_so/android_x86_64/obj/bionic/libc/arch-common/bionic/crtend_so.o -o o
ut/soong/.intermediates/frameworks/native/services/inputflinger/libinputflinger/android_x86_64_shared/unstripped/libinputflinger.so -target x86_64-linux-android10000 -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -W
l,--build-id=md5 -Wl,--fatal-warnings -Wl,--no-undefined-version -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libgcc_stripped.a -Wl,--exclude-libs,libunwind_llvm.a -Wl,--exclude-libs,libunwind.a -Wl,--icf=safe
-fuse-ld=lld -Wl,--pack-dyn-relocs=android+relr -Wl,--no-undefined -Wl,--hash-style=gnu -Wl,--exclude-libs=libclang_rt.builtins.a -m64 -nostdlib -Wl,--gc-sections -shared -Wl,-soname,libinputflinger.so -Wl,--ex
clude-libs,libclang_rt.ubsan_minimal.a -fsanitize=bounds -fno-sanitize-link-runtime -Wl,--exclude-libs,libclang_rt.ubsan_minimal.a
ld.lld: error: undefined symbol: android::CallStack::CallStack(char const*, int)
>>> referenced by InputDispatcher.cpp:356 (frameworks/native/services/inputflinger/dispatcher/InputDispatcher.cpp:356)
>>> InputDispatcher.o:(android::inputdispatcher::InputDispatcher::createInputMonitor(int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int)) in arch
ive out/soong/.intermediates/frameworks/native/services/inputflinger/dispatcher/libinputdispatcher/android_x86_64_static/libinputdispatcher.a
ld.lld: error: undefined symbol: android::CallStack::update(int, int)
>>> referenced by InputDispatcher.cpp:357 (frameworks/native/services/inputflinger/dispatcher/InputDispatcher.cpp:357)
>>> InputDispatcher.o:(android::inputdispatcher::InputDispatcher::createInputMonitor(int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int)) in arch
ive out/soong/.intermediates/frameworks/native/services/inputflinger/dispatcher/libinputdispatcher/android_x86_64_static/libinputdispatcher.a
ld.lld: error: undefined symbol: android::CallStack::log(char const*, android_LogPriority, char const*) const
>>> referenced by InputDispatcher.cpp:358 (frameworks/native/services/inputflinger/dispatcher/InputDispatcher.cpp:358)
>>> InputDispatcher.o:(android::inputdispatcher::InputDispatcher::createInputMonitor(int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int)) in arch
ive out/soong/.intermediates/frameworks/native/services/inputflinger/dispatcher/libinputdispatcher/android_x86_64_static/libinputdispatcher.a
可以看到这里确实在编译InputDispatcher.cpp:356时候发现引入ld不到libutilscallstack库,所以导致无法找到符号表报错,但是明明我们确实cpp编译的bp中加入了相关的libutilscallstack,那这种应该怎么解决呢?
其实这种问题大家一定要认真看编译的报错日志第一行,看看具体编译哪个目标时候在报错:
[ 86% 211/244] //frameworks/native/services/inputflinger:libinputflinger link libinputflinger.so
大家注意这里是在编译libinputflinger.so时候报错的,那么大家就可以考虑找到libinputflinger的编译Android.bp,然后考虑加入libutilscallstack
frameworks/native/services/inputflinger/Android.bp
修改如下
再进行编译直接成果:
本质上其实就是libiinputflinger编译时候会对这个libinputdispatcher静态库有依赖,它libiinputflinger报错了引入不到,就需要把libutilscallstack加入到这个库的Android.bp.
验证:
学员案例2
这个文章已经讲解过了libgui这个库的BufferQueueProducer加入相关的CallStack会报错,进入基本无解状态
https://blog.csdn.net/learnframework/article/details/143989499
但是大家仔细一看报错
这些编译都不是在编译libgui.so时候报错的,都是编译media相关库才报错的,也就是说其实单独编译libgui是可以成功的
所以这里完全可以通过push libgui.so到手机系统获取模拟进行更新,也可以正常运行起来,这里就不进行整编也是完全可以看到相关的堆栈。注意这里如果模拟器整编还是报错,只能回退再编译,但是可以保存单编译libgui.so覆盖回退的,然后再触发打包既可以。
更多framework实战技术干货,请关注下面“千里马学框架”