打印函数调用堆栈

static struct {
char *name;
int signum;
int flags; // 0: default handler, >0: catch, <0: ignore
} sig_table[] = {
{"zero", 0, 0 },
{"SIGHUP", SIGHUP, -1},
{"SIGINT", SIGINT, 1},
{"SIGQUIT", SIGQUIT, -1},
{"SIGILL", SIGILL, 1},
{"SIGTRAP", SIGTRAP, -1},
{"SIGABRT", SIGABRT, 1},
{"SIGBUS", SIGBUS, 1},
{"SIGFPE", SIGFPE, -1},
{"SIGKILL", SIGKILL, 0}, // reserved
{"SIGUSR1", SIGUSR1, 2}, // for light flicker
{"SIGSEGV", SIGSEGV, 1},
{"SIGUSR2", SIGUSR2, -1},
{"SIGPIPE", SIGPIPE, -1},
{"SIGALRM", SIGALRM, -1},
{"SIGTERM", SIGTERM, 1}, // for kill
{"SIGSTKFLT", SIGSTKFLT, -1},
//{"SIGCHLD", SIGCHLD, -1},
{"SIGCONT", SIGCONT, -1},
{"SIGSTOP", SIGSTOP, 0}, // reserved
{"SIGTSTP", SIGTSTP, -1},
{"SIGTTIN", SIGTTIN, -1},
{"SIGTTOU", SIGTTOU, -1},
{"SIGURG", SIGURG, -1},
{"SIGXCPU", SIGXCPU, -1},
{"SIGXFSZ", SIGXFSZ, -1},
{"SIGVTALRM", SIGVTALRM, -1},
{"SIGPROF", SIGPROF, -1},
{"SIGWINCH", SIGWINCH, -1},
{"SIGIO", SIGIO, -1},
{"SIGPWR", SIGPWR, -1},
{"SIGSYS", SIGSYS, -1},
};




#if 0
void dump(int signo)
{
char buf[1024];
char cmd[1024];
FILE *fp=NULL;
snprintf(buf,sizeof(buf),"/proc/%d/cmdline",getpid());
if(!(fp=fopen(buf,"r")))
{
return;
}
if(!(fgets(buf,sizeof(buf),fp)))
{
return;
}
fclose(fp);
if(buf[strlen(buf)-1]=='\n')
buf[strlen(buf)-1]='\0';
snprintf(cmd,sizeof(cmd),"gdb %s %d",buf,getpid());
printf("\n dump buf==%s\n",buf);
system(cmd);
}
#else
void dump(int signo)
{
void *array[30]={0};
size_t size=0,i=0;
char** strings=NULL;
printf("\n dump----1\n");
size=backtrace(array,30);
printf("\n dump----2 size==%d\n",size);
strings=backtrace_symbols(array,size);
printf("Obtained %d stackframes.\n",size);
for(i=0;i<size;i++)
{
printf("%s\n",strings[i]);
FunUserLog(strings[i],strlen(strings[i]));
}
free(strings);
}


#endif
static void signalHandler1(int signum)
{
if ((signum > 0) && (signum <= SIGSYS)) {
MainDebug("stop app on signal %s(%d)\n", sig_table[signum].name, signum);
} else {
MainDebug("stop app on error(%d)\n", signum);
}
if(signum ==SIGSEGV)
{
printf("\n programme recv SIGSEGV\n");
char *buf="programme recv SIGSEGV";
FunUserLog(buf,strlen(buf));
dump(SIGSEGV);
//sleep(5);
}
gblSetQuit();
exit(0);
}


static void signalHandler2(int signum)
{
if(!light_state)
{
light_state = 1;
}
return;
}




/*
 * setup_signal_handlers - set simple process signal processing policy.
*/
static void setup_signal_handlers(void)
{
int entry;
struct sigaction sigsetup;


// set proc signal handler
for (entry = 0; entry < sizeof(sig_table) / sizeof(sig_table[0]); entry++) {
memset(&sigsetup, 0, sizeof(sigsetup));
sigemptyset(&sigsetup.sa_mask);
sigsetup.sa_flags = 0;

// exit on system signal
if (sig_table[entry].flags == 1)
{
sigsetup.sa_handler = signalHandler1;
sigaction(sig_table[entry].signum, &sigsetup, NULL);
}


// exit on module signal
if (sig_table[entry].flags == 2)
{
sigsetup.sa_handler = signalHandler2;
sigaction(sig_table[entry].signum, &sigsetup, NULL);
}


// ignore these
if (sig_table[entry].flags < 0) {
sigsetup.sa_handler = SIG_IGN;
sigaction(sig_table[entry].signum, &sigsetup, NULL);
}
// default to others
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是在Android9的system/core/init/init.cpp文件HandleControlMessage函数中打印函数调用堆栈信息的实现代码: ```c++ void HandleControlMessage(const std::vector<Subcontext>& subcontexts, const std::string& msg) { std::string cmd = android::base::Trim(msg); if (cmd.empty()) { return; } ALOGV("control message '%s'", cmd.c_str()); // 打印函数调用堆栈信息 android::base::ScopedLogSeverity severity(android::base::DEBUG); android::base::CallStack stack; ALOGD("Function call stack:\n%s", stack.ToString().c_str()); if (cmd == "restart") { // 重启系统 RestartProcess(); } else if (cmd == "reboot") { // 重启设备 DoReboot(); } else if (cmd == "shutdown") { // 关闭设备 DoShutdown(); } else if (StartsWith(cmd, "sigstop")) { // 发送SIGSTOP信号给指定进程 HandleSignalCommand(subcontexts, cmd, SIGSTOP); } else if (StartsWith(cmd, "sigcont")) { // 发送SIGCONT信号给指定进程 HandleSignalCommand(subcontexts, cmd, SIGCONT); } else if (StartsWith(cmd, "signal ")) { // 发送指定信号给指定进程 HandleSignalCommand(subcontexts, cmd.substr(strlen("signal ")), 0); } } ``` 其中,打印函数调用堆栈信息的代码为: ```c++ // 打印函数调用堆栈信息 android::base::ScopedLogSeverity severity(android::base::DEBUG); android::base::CallStack stack; ALOGD("Function call stack:\n%s", stack.ToString().c_str()); ``` 这段代码使用了Android库中的android::base::CallStack类,用于获取当前函数调用堆栈信息,并使用Android库中的android::base::Log类打印调用堆栈信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值