検索条件
全2件
(1/1ページ)
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/syscall.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <pthread.h>
#include <signal.h>
#define gettid() syscall(SYS_gettid)
// 0: sigprocmask at process, 1:thr1,
#define DF_CHGMASK_ID 2
//#define DF_USE_PTHREADMASK
//#define DF_INITIAL_MASK (SIGSEGV)
//#define DF_INITIAL_MASK (SIGABRT)
#define DF_INITIAL_MASK (12)
void abt_handler(int n, siginfo_t *pSigInf, void *pContext)
{
struct sigaction sa;
printf("I am dead...[%d][parent:%d][tid=%d][thread_id=%ld]", getpid(), getppid(), gettid(), (long)pthread_self());
memset(&sa,0,sizeof(struct sigaction));
//_exit(1);
sigemptyset(&sa.sa_mask);
// sa.sa_flags |= SA_SIGINFO ;
sa.sa_handler = SIG_DFL;
// sigaction(SIGABRT,&sa,NULL);
// raise(SIGABRT);
}
void register_handler()
{
struct sigaction sa;
memset(&sa,0,sizeof(struct sigaction));
sigemptyset(&sa.sa_mask);
sa.sa_flags |= SA_SIGINFO ;
sa.sa_sigaction = abt_handler;
// sigaction(SIGABRT,&sa,NULL);
sigaction( 12,&sa,NULL);
}
struct st_signals_st {
int signo;
const char *pcSignal ;
} st_signals[] = {
{SIGHUP, "SIGHUP"},
{SIGINT, "SIGINT"},
{SIGQUIT, "SIGQUIT"},
{SIGILL, "SIGILL"},
{SIGTRAP, "SIGTRAP"},
{SIGABRT, "SIGABRT"},
{SIGIOT, "SIGIOT"},
{SIGBUS, "SIGBUS"},
{SIGFPE, "SIGFPE"},
{SIGKILL, "SIGKILL"},
{SIGUSR1, "SIGUSR1"},
{SIGSEGV, "SIGSEGV"},
{SIGUSR2, "SIGUSR2"},
{SIGPIPE, "SIGPIPE"},
{SIGALRM, "SIGALRM"},
{SIGTERM, "SIGTERM"},
{SIGSTKFLT, "SIGSTKFLT"},
{SIGCHLD, "SIGCHLD"},
{SIGCONT, "SIGCONT"},
{SIGSTOP, "SIGSTOP"},
{SIGTSTP, "SIGTSTP"},
{SIGTTIN, "SIGTTIN"},
{SIGTTOU, "SIGTTOU"},
{SIGURG, "SIGURG"},
{SIGXCPU, "SIGXCPU"},
{SIGXFSZ, "SIGXFSZ"},
{SIGVTALRM, "SIGVTALRM"},
{SIGPROF, "SIGPROF"},
{SIGWINCH, "SIGWINCH"},
{SIGIO, "SIGIO"},
{SIGPOLL, "SIGPOLL"},
{SIGPWR, "SIGPWR"},
{SIGSYS, "SIGSYS"},
{0, NULL}
} ;
void dump_sigmask(const char* pMsg, sigset_t* sig_mask)
{
struct st_signals_st* pStSignal = st_signals ;
int i;
puts(pMsg);
while( pStSignal->pcSignal ){
if (sigismember( sig_mask, pStSignal->signo )) {
putchar('1');
}
else {
putchar('0');
}
pStSignal++;
}
putchar('_');
for (i=SIGRTMIN; i<=SIGRTMAX; i++) {
if (sigismember( sig_mask, i )) {
putchar('1');
}
else {
putchar('0');
}
}
puts("");
return ;
}
void* thr1(void* arg)
{
sigset_t sig_mask ;
sleep(1);
printf("[%d/ppid=%d/tid=%d/self=%ld] wakeup thr1!\n", getpid(), getppid(), gettid(), (long)pthread_self());
pthread_sigmask(SIG_UNBLOCK, NULL, &sig_mask);
dump_sigmask("thr1", &sig_mask);
#if (DF_CHGMASK_ID==1)
sigfillset(&sig_mask);
#ifdef DF_USE_PTHREADMASK
if (pthread_sigmask(SIG_SETMASK, &sig_mask, NULL)) {
#else
if (sigprocmask(SIG_SETMASK, &sig_mask, NULL)) {
#endif
perror ("main(): failure set...");
}
#endif
sleep(4);
pthread_sigmask(SIG_UNBLOCK, NULL, &sig_mask);
dump_sigmask("thr1", &sig_mask);
#if (DF_CHGMASK_ID==1)
sigemptyset(&sig_mask);
#ifdef DF_USE_PTHREADMASK
if (pthread_sigmask(SIG_SETMASK, &sig_mask, NULL)) {
#else
if (sigprocmask(SIG_SETMASK, &sig_mask, NULL)) {
#endif
perror ("main(): failure set...");
}
#endif
sleep(4);
pthread_sigmask(SIG_UNBLOCK, NULL, &sig_mask);
dump_sigmask("thr1", &sig_mask);
sleep(10);
}
void* thr2(void* arg)
{
sigset_t sig_mask ;
register_handler();
// sigaddset(&sig_mask, DF_INITIAL_MASK) ;
sigemptyset(&sig_mask);
sigaddset(&sig_mask, 12) ;
#ifdef DF_USE_PTHREADMASK
if (pthread_sigmask(SIG_UNBLOCK, &sig_mask, NULL)) {
#else
if (sigprocmask(SIG_UNBLOCK, &sig_mask, NULL)) {
#endif
perror ("thr2(): Dead set...");
}
sleep(2);
printf("[%d/ppid=%d/tid=%d/self=%ld] wakeup thr2!\n", getpid(), getppid(), gettid(), (long)pthread_self());
pthread_sigmask(SIG_UNBLOCK, NULL, &sig_mask);
dump_sigmask("thr2", &sig_mask);
sleep(4);
pthread_sigmask(SIG_UNBLOCK, NULL, &sig_mask);
dump_sigmask("thr2", &sig_mask);
sleep(4);
pthread_sigmask(SIG_UNBLOCK, NULL, &sig_mask);
dump_sigmask("thr2", &sig_mask);
system("echo thr2 is spawn $$ ; sleep 17");
sleep(3);
}
int
main(int argc, char *argv[])
{
int status=0;
int fd;
pthread_t child[2];
sigset_t sig_mask ;
sigfillset(&sig_mask);
if (sigprocmask(SIG_BLOCK, &sig_mask, NULL)) {
perror ("main(): Dead set...");
}
/*
sigaddset(&sig_mask, DF_INITIAL_MASK) ;
if (sigprocmask(SIG_UNBLOCK, &sig_mask, NULL)) {
perror ("main(): Dead set...");
}
*/
// register_handler();
if (sigprocmask(SIG_UNBLOCK, NULL, &sig_mask)) {
perror ("main(): Dead get...");
}
dump_sigmask("main", &sig_mask);
/* スレッド生成 */
pthread_create(&child[0], NULL, thr1, NULL );
pthread_create(&child[1], NULL, thr2, NULL );
sleep(4);
#if (DF_CHGMASK_ID==0)
sigemptyset(&sig_mask);
if (sigprocmask(SIG_SETMASK, &sig_mask, NULL)) {
perror ("main(): failure set...");
}
#endif
if (sigprocmask(SIG_UNBLOCK, NULL, &sig_mask)) {
perror ("main(): Dead get...");
}
dump_sigmask("main", &sig_mask);
sleep(4);
#if (DF_CHGMASK_ID==0)
sigfillset(&sig_mask);
if (sigprocmask(SIG_SETMASK, &sig_mask, NULL)) {
perror ("main(): failure set...");
}
#endif
if (sigprocmask(SIG_UNBLOCK, NULL, &sig_mask)) {
perror ("main(): Dead get...");
}
dump_sigmask("main", &sig_mask);
sleep(4);
if (sigprocmask(SIG_UNBLOCK, NULL, &sig_mask)) {
perror ("main(): Dead get...");
}
dump_sigmask("main", &sig_mask);
status = pthread_join(child[0], NULL);
if (status<0) {
printf("pthread_join(0) returns: %d\n", status);
}
status = pthread_join(child[1], NULL);
if (status<0) {
printf("pthread_join(0) returns: %d\n", status);
}
return 0;
}
/*
* sigaction sample program for powerpc32
* You can add more informations in segv_handler().
* In this fucntion, you have pointer of stacks, regs, contexts...
* If we can allow increase size of binary, we can continu using backtrace_symbols()/backtrace_symbols_fd().
* Please refer man-pages, info-pages and a lot of WEB-pages B)
*
* Author: 30/Aug./2012 YNK
* NOTE: Don't use '=O2' because optimization makes no 'bl' instructions to call function.
*/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <execinfo.h>
#include <linux/sysctl.h>
#include <sys/ucontext.h>
int (*func_ptr)() = (void *)0x1234567;
int func1();
int func2();
void segv_handler(int n, siginfo_t *pSigInf, void *pContext);
int main(int argc,char ** argv)
{
struct sigaction sa;
memset(&sa,0,sizeof(struct sigaction));
sigemptyset(&sa.sa_mask);
sa.sa_flags |= SA_SIGINFO ;
sa.sa_sigaction = segv_handler;
sigaction(SIGSEGV,&sa,NULL);
func1();
return 0;
}
int func1()
{
func2();
return 0;
}
int func2()
{
*(int*)0xBAD2DEAD = 2;
func_ptr();
return 0;
}
void segv_handler(int n, siginfo_t *pSigInf, void *pContext)
{
int cnt, i;
void **arr = alloca(256 * sizeof(void *));
ucontext_t* pCon = (ucontext_t *)pContext;
printf("*** segmentation fault! (No=%d)\n", n);
printf(" An errno value: %d\n", pSigInf->si_errno );
printf(" Signal code : %d\n", pSigInf->si_code );
printf(" access address : %p\n", pSigInf->si_addr );
// struct defined in ptrace.h
for(i=0;i<32;i++) {
printf("GPRS%2d: 0x%08X\n", i, pCon->uc_mcontext.regs->gpr[i]);
}
printf("NIP=0x%08X MSR=0x%08X\n", pCon->uc_mcontext.regs->nip, pCon->uc_mcontext.regs->msr );
printf("\n\n *** backtrace address ***\n");
cnt = backtrace(arr, 256);
for(i=0;i<cnt;i++) {
printf("\t%3d: 0x%08X\n", i, arr[i]);
}
/* if included symbolx(compile with "-r dynamic") */
backtrace_symbols_fd(arr, cnt, 2);
abort();
}