SmartAudio/package/allwinner/liballwinner_tina/liballwinner/LIBRARY/DEMUX/BASE/CdxDebug.c

106 lines
2.4 KiB
C
Executable File

/*
* Copyright (c) 2008-2016 Allwinner Technology Co. Ltd.
* All rights reserved.
*
* File : CdxDebug.c
* Description : Debug
* History :
*
*/
#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include "cdx_config.h"
#ifdef __ANDROID__
#if (CONFIG_OS_VERSION < OPTION_OS_VERSION_ANDROID_5_0)
#include <corkscrew/backtrace.h>
#endif
#endif
#include <dirent.h>
#include <stdlib.h>
#include <string.h>
#include <CdxLog.h>
#include <unistd.h>
#include <CdxDebug.h>
#ifdef LOG_TAG
#undef LOG_TAG
#endif
#define LOG_TAG "CdxDebug"
void CdxDumpThreadStack(pthread_t tid)
{
#if ((CONFIG_OS == OPTION_OS_ANDROID) && (CONFIG_OS_VERSION < OPTION_OS_VERSION_ANDROID_5_0))
const size_t MAX_DEPTH = 32;
pthread_t tagTid;
pthread_t curTid = gettid();
tagTid = (tid == -1) ? curTid : tid;
backtrace_frame_t backtrace[MAX_DEPTH];
ssize_t frames = unwind_backtrace_thread(tagTid, backtrace, 0, MAX_DEPTH);
if (frames > 0)
{
backtrace_symbol_t backtrace_symbols[MAX_DEPTH];
get_backtrace_symbols(backtrace, frames, backtrace_symbols);
size_t i = (tagTid == curTid) ? 2 : 0;
for (; i < (size_t)frames; i++)
{
char line[1024];
format_backtrace_line(i, &backtrace[i], &backtrace_symbols[i],
line, 1024);
CDX_LOGD(" %s\n", line);
}
free_backtrace_symbols(backtrace_symbols, frames);
}
else
{
CDX_LOGD("(native backtrace unavailable), tid(%lu)", tagTid);
}
#else
(void)tid;
return;
#endif
}
static int CdxCommonScanDirFilter(const struct dirent *dir)
{
if (!strcmp(dir->d_name, ".") || !strcmp(dir->d_name, ".."))
{
return 0;
}
return 1;
}
void CdxCallStack(void)
{
char procTaskPath[128] = {0};
struct dirent **namelist;
int threadNum = 0, i = 0;
sprintf(procTaskPath, "/proc/%d/task", getpid());
threadNum = scandir(procTaskPath, &namelist, CdxCommonScanDirFilter, NULL);
if (threadNum <= 0)
{
CDX_LOGE("no task???");
return ;
}
for (i = 0; i < threadNum; i++)
{
pthread_t pid= (pthread_t)atol(namelist[i]->d_name);
CDX_LOGD("------------tid(%ld)------------", (unsigned long)pid);
CdxDumpThreadStack(pid);
CDX_LOGD("------------tid(%ld) end------------\n\n", (unsigned long)pid);
}
free(namelist);
return ;
}