Android系统下打印函数调用栈信息(c++部分)
一、需要添加3部分
1、依赖的库
libutilscallstack.so
Android.mk下添加LOCAL_SHARED_LIBRARIES := libdl libdisplaydebug libsdmutils libutilscallstack
如果不添加对libutilscallstack.so的引用,出现以下错误
hardware/qcom/display/sdm/libs/core/display_base.cpp:41:10: fatal error: 'utils/CallStack.h' file not found
#include <utils/CallStack.h>
^~~~~~~~~~~~~~~~~~~
或
ld.lld: error: undefined symbol: android::CallStack::CallStack()
>>> referenced by display_base.cpp:549 (hardware/qcom/display/sdm/libs/core/display_base.cpp:549)
>>> out/target/product/trinket/obj/SHARED_LIBRARIES/libsdmcore_intermediates/display_base.o:(sdm::DisplayBase::SetDisplayState(sdm::DisplayState, bool, int*))
ld.lld: error: undefined symbol: android::CallStack::update(int, int)
>>> referenced by display_base.cpp:550 (hardware/qcom/display/sdm/libs/core/display_base.cpp:550)
>>> out/target/product/trinket/obj/SHARED_LIBRARIES/libsdmcore_intermediates/display_base.o:(sdm::DisplayBase::SetDisplayState(sdm::DisplayState, bool, int*))
ld.lld: error: undefined symbol: android::CallStack::dump(int, int, char const*) const
>>> referenced by display_base.cpp:551 (hardware/qcom/display/sdm/libs/core/display_base.cpp:551)
>>> out/target/product/trinket/obj/SHARED_LIBRARIES/libsdmcore_intermediates/display_base.o:(sdm::DisplayBase::SetDisplayState(sdm::DisplayState, bool, int*))
ld.lld: error: undefined symbol: android::CallStack::log(char const*, android_LogPriority, char const*) const
>>> referenced by display_base.cpp:552 (hardware/qcom/display/sdm/libs/core/display_base.cpp:552)
>>> out/target/product/trinket/obj/SHARED_LIBRARIES/libsdmcore_intermediates/display_base.o:(sdm::DisplayBase::SetDisplayState(sdm::DisplayState, bool, int*))
ld.lld: error: undefined symbol: android::CallStack::~CallStack()
>>> referenced by display_base.cpp:658 (hardware/qcom/display/sdm/libs/core/display_base.cpp:658)
>>> out/target/product/trinket/obj/SHARED_LIBRARIES/libsdmcore_intermediates/display_base.o:(sdm::DisplayBase::SetDisplayState(sdm::DisplayState, bool, int*))
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
14:33:25 ninja failed with: exit status 1
2、添加接口的头文件
#include <utils/CallStack.h>
如果不添加以上头文件,会出现以下错误
RED_LIBRARIES/libsdmcore_intermediates/display_base.o hardware/qcom/display/sdm/libs/core/display_base.cpp"
hardware/qcom/display/sdm/libs/core/display_base.cpp:549:3: error: use of undeclared identifier 'android'
android::CallStack callstack;
^
hardware/qcom/display/sdm/libs/core/display_base.cpp:552:42: error: use of undeclared identifier 'ANDROID_LOG_DEBUG'
callstack.log("callstack-tag-display", ANDROID_LOG_DEBUG, " ");
3、调用的接口
android::CallStack callstack;
callstack.update();
callstack.dump(1);//打印到输出
callstack.log("callstack-tag-display", ANDROID_LOG_DEBUG, " ");//logcat输出
二、举例
1、在hardware/qcom/display/sdm/libs/core/display_base.cpp添加栈信息
对应patch
diff --git a/sdm/libs/core/Android.mk b/sdm/libs/core/Android.mk
index c934de06..43d09992 100644
--- a/sdm/libs/core/Android.mk
+++ b/sdm/libs/core/Android.mk
@@ -10,7 +10,7 @@ LOCAL_HEADER_LIBRARIES := display_headers
LOCAL_CFLAGS := -fno-operator-names -Wno-unused-parameter -DLOG_TAG=\"SDM\" \
$(common_flags)
LOCAL_HW_INTF_PATH_1 := fb
-LOCAL_SHARED_LIBRARIES := libdl libdisplaydebug libsdmutils
+LOCAL_SHARED_LIBRARIES := libdl libdisplaydebug libsdmutils libutilscallstack
ifneq ($(TARGET_IS_HEADLESS), true)
LOCAL_CFLAGS += -isystem external/libdrm
diff --git a/sdm/libs/core/display_base.cpp b/sdm/libs/core/display_base.cpp
index f1b15c3e..ffc94af5 100755
--- a/sdm/libs/core/display_base.cpp
+++ b/sdm/libs/core/display_base.cpp
@@ -38,6 +38,7 @@
#include "display_base.h"
#include "hw_info_interface.h"
+#include <utils/CallStack.h>
#define __CLASS__ "DisplayBase"
@@ -545,6 +546,11 @@ DisplayError DisplayBase::SetDisplayState(DisplayState state, bool teardown,
DLOGI("Set state = %d, display %d-%d, teardown = %d", state, display_id_,
display_type_, teardown);
+ android::CallStack callstack;
+ callstack.update();
+ callstack.dump(1);
+ callstack.log("callstack-tag-display", ANDROID_LOG_DEBUG, " ");
+
if (state == state_) {
DLOGI("Same state transition is requested.");
return kErrorNone;
2、编译 make libsdmcore (Android.mk文件中LOCAL_MODULE := libsdmcore)(所用编译工具链为vendor/qcom/proprietary/llvm-arm-toolchain-ship/10.0/bin/clang++)
3、替换库
adb root;adb disable-verity;adb reboot
adb root;adb remount
adb push ./trinket/vendor/lib64/libsdmcore.so vendor/lib64/; adb push ./trinket/vendor/lib/libsdmcore.so vendor/lib
4、重启设备adb reboot,重启后单击电源键,让手机从唤醒进入睡眠状态,程序就能走到栈调用的位置
以下为效果
12-21 00:31:05.474 723 3217 D callstack-tag-display: #00 pc 0000000000036944 /vendor/lib64/libsdmcore.so (sdm::DisplayBase::SetDisplayState(sdm::DisplayState, bool, int*)+156)
12-21 00:31:05.474 723 3217 D callstack-tag-display: #01 pc 00000000000414b4 /vendor/lib64/libsdmcore.so (sdm::DisplayBuiltIn::SetDisplayState(sdm::DisplayState, bool, int*)+152)
12-21 00:31:05.474 723 3217 D callstack-tag-display: #02 pc 000000000004082c /vendor/lib64/hw/hwcomposer.trinket.so (sdm::HWCDisplay::SetPowerMode(HWC2::PowerMode, bool)+488)
12-21 00:31:05.474 723 3217 D callstack-tag-display: #03 pc 000000000004a48c /vendor/lib64/hw/hwcomposer.trinket.so (sdm::HWCDisplayBuiltIn::SetPowerMode(HWC2::PowerMode, bool)+96)
12-21 00:31:05.474 723 3217 D callstack-tag-display: #04 pc 000000000002cb08 /vendor/lib64/hw/hwcomposer.trinket.so (int sdm::HWCSession::CallDisplayFunction<HWC2::PowerMode, bool>(hwc2_device*, unsigned long, HWC2::Error (sdm::HWCDisplay::*)(HWC2::PowerMode, bool), HWC2::PowerMode, bool)+248)
12-21 00:31:05.474 723 3217 D callstack-tag-display: #05 pc 000000000002c82c /vendor/lib64/hw/hwcomposer.trinket.so (sdm::HWCSession::SetPowerMode(hwc2_device*, unsigned long, int)+480)
12-21 00:31:05.474 723 3217 D callstack-tag-display: #06 pc 00000000000139ac /vendor/bin/hw/android.hardware.graphics.composer@2.4-service (android::hardware::graphics::composer::V2_2::hal::detail::ComposerClientImpl<android::hardware::graphics::composer::V2_3::IComposerClient, android::hardware::graphics::composer::V2_3::hal::ComposerHal>::setPowerMode_2_2(unsigned long, android::hardware::graphics::composer::V2_2::IComposerClient::PowerMode)+28)
12-21 00:31:05.474 723 3217 D callstack-tag-display: #07 pc 0000000000026df0 /apex/com.android.vndk.v30/lib64/android.hardware.graphics.composer@2.2.so (android::hardware::graphics::composer::V2_2::BnHwComposerClient::_hidl_setPowerMode_2_2(android::hidl::base::V1_0::BnHwBase*, android::hardware::Parcel const&, android::hardware::Parcel*, std::__1::function<void (android::hardware::Parcel&)>)+208)
12-21 00:31:05.474 723 3217 D callstack-tag-display: #08 pc 00000000000422c8 /apex/com.android.vndk.v30/lib64/android.hardware.graphics.composer@2.4.so (android::hardware::graphics::composer::V2_4::BnHwComposerClient::onTransact(unsigned int, android::hardware::Parcel const&, android::hardware::Parcel*, unsigned int, std::__1::function<void (android::hardware::Parcel&)>)+2272)
12-21 00:31:05.475 723 3217 D callstack-tag-display: #09 pc 00000000000941d8 /apex/com.android.vndk.v30/lib64/libhidlbase.so (android::hardware::BHwBinder::transact(unsigned int, android::hardware::Parcel const&, android::hardware::Parcel*, unsigned int, std::__1::function<void (android::hardware::Parcel&)>)+68)
12-21 00:31:05.475 723 3217 D callstack-tag-display: #10 pc 0000000000098170 /apex/com.android.vndk.v30/lib64/libhidlbase.so (android::hardware::IPCThreadState::getAndExecuteCommand()+1076)
12-21 00:31:05.475 723 3217 D callstack-tag-display: #11 pc 00000000000993b8 /apex/com.android.vndk.v30/lib64/libhidlbase.so (android::hardware::IPCThreadState::joinThreadPool(bool)+96)
12-21 00:31:05.475 723 3217 D callstack-tag-display: #12 pc 00000000000a845c /apex/com.android.vndk.v30/lib64/libhidlbase.so (android::hardware::PoolThread::threadLoop()+24)
12-21 00:31:05.475 723 3217 D callstack-tag-display: #13 pc 00000000000154cc /apex/com.android.vndk.v30/lib64/libutils.so (android::Thread::_threadLoop(void*)+260)
12-21 00:31:05.475 723 3217 D callstack-tag-display: #14 pc 0000000000014d90 /apex/com.android.vndk.v30/lib64/libutils.so (thread_data_t::trampoline(thread_data_t const*)+412)
12-21 00:31:05.475 723 3217 D callstack-tag-display: #15 pc 00000000000b0048 /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+64)
12-21 00:31:05.475 723 3217 D callstack-tag-display: #16 pc 00000000000503c8 /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+64)
12-21 00:31:05.475 0 0 I : [<0>][3217, HwBinder:723_3][drm:sde_connector_atomic_set_property:1160] sde connector set power mode = SDE_MODE_DPMS_OFF
本文地址:https://blog.csdn.net/chen245250566/article/details/111909525