android hal层 c 堆栈打印方法
比如要追踪 hardware/qcom/audio/hal/audio_hw.c 中adev_set_mode() 函数的函数堆栈调用关系
实际原理就是利用c++ callstack 库,重新编译成c库后使用即可.
1. 在hardware/qcom/audio/hal/ 下添加 callstack.cpp 和 callstack.h文件 callstack.cpp 内容:
#include <utils/CallStack.h>
extern "C" void dumping_callstack(void);
void dumping_callstack(void)
{
android::CallStack cs("Jamie");
}
callstack.h内容:
void dumping_callstack(void);
2. Android.mk 加入源文件 和 libutils 库, 如下:安卓 hal层 C 文件中加调试堆栈
3. Audio_hw.c 中包含头文件 : #include “callstack.h”
4. Adev_set_mode 中调用 dumping_callstack()
编译so
运行后打印堆栈如下:
再使用addr2line 解析堆栈,即可查清调用关系
addr2line 解析堆栈方法:https://mp.csdn.net/console/editor/html/104619393
实测:
wl@ubuntudhsb:~/13_6_new/HLOS/out/target/product/msm8909w$ git diff
diff --git a/frameworks/av/media/audioserver/Android.mk b/frameworks/av/media/audioserver/Android.mk
old mode 100644
new mode 100755
diff --git a/hardware/qcom/audio/msm8909/hal/Android.mk b/hardware/qcom/audio/msm8909/hal/Android.mk
old mode 100644
new mode 100755
index 6428abb..80d111c
--- a/hardware/qcom/audio/msm8909/hal/Android.mk
+++ b/hardware/qcom/audio/msm8909/hal/Android.mk
@@ -44,6 +44,8 @@ LOCAL_SRC_FILES := \
LOCAL_SRC_FILES += audio_extn/audio_extn.c \
audio_extn/utils.c
+LOCAL_SRC_FILES += callstack.cpp
LOCAL_C_INCLUDES += $(BOARD_KERNEL_HEADER_DIR)
LOCAL_ADDITIONAL_DEPENDENCIES += $(BOARD_KERNEL_HEADER_DEPENDENCIES)
@@ -220,7 +222,8 @@ LOCAL_SHARED_LIBRARIES := \
libaudioroute \
libdl \
libhardware \
- libexpat
+ libexpat \
+ libutils
LOCAL_C_INCLUDES += \
external/tinyalsa/include \
diff --git a/hardware/qcom/audio/msm8909/hal/audio_hw.c b/hardware/qcom/audio/msm8909/hal/audio_hw.c
index 59cc19c..c829a13 100755
--- a/hardware/qcom/audio/msm8909/hal/audio_hw.c
+++ b/hardware/qcom/audio/msm8909/hal/audio_hw.c
@@ -55,6 +55,9 @@
#include "sound/compress_params.h"
#include "sound/asound.h"
+#include "callstack.h"
#define COMPRESS_OFFLOAD_NUM_FRAGMENTS 4
/* ToDo: Check and update a proper value in msec */
#define COMPRESS_OFFLOAD_PLAYBACK_LATENCY 96
@@ -3594,6 +3597,7 @@ static int period_size_is_plausible_for_low_latency(int period_size)
static int adev_open(const hw_module_t *module, const char *name,
hw_device_t **device)
{
+ dumping_callstack();
int i, ret;
ALOGD("%s: enter", __func__);
wl@ubuntudhsb:~/13_6_new/HLOS/out/target/product/msm8909w$ cat hardware/qcom/audio/msm8909/hal/callstack.cpp
//#include "callstack.h"
#include <utils/CallStack.h>
//#include <utils/Log.h>
extern "C" void dumping_callstack(void);
void dumping_callstack(void)
{
android::CallStack cs("wuleiCallStack");
}
cat hardware/qcom/audio/msm8909/hal/callstack.h
void dumping_callstack(void);
好文:https://blog.csdn.net/u010116586/article/details/91486568