r4062 - in developers: . tick tick/ecoreglib tick/stackutil

tick at sita.openmoko.org tick at sita.openmoko.org
Wed Feb 13 10:05:28 CET 2008


Author: tick
Date: 2008-02-13 10:05:23 +0100 (Wed, 13 Feb 2008)
New Revision: 4062

Added:
   developers/tick/
   developers/tick/ecoreglib/
   developers/tick/ecoreglib/ecoreglib.c
   developers/tick/ecoreglib/ecoreglib.h
   developers/tick/stackutil/
   developers/tick/stackutil/Makefile
   developers/tick/stackutil/stack_util.c
   developers/tick/stackutil/stack_util.h
   developers/tick/stackutil/stackdemo.c
Log:
stackutil: A debug util
ecoreglib: Integrate the main loop of E into glib


Added: developers/tick/ecoreglib/ecoreglib.c
===================================================================
--- developers/tick/ecoreglib/ecoreglib.c	2008-02-13 06:59:22 UTC (rev 4061)
+++ developers/tick/ecoreglib/ecoreglib.c	2008-02-13 09:05:23 UTC (rev 4062)
@@ -0,0 +1,38 @@
+#include <glib.h>
+#include <Ecore.h>
+
+#include "ecoreglib.h"
+
+static gboolean GEvas_prepare (GSource *source, gint *timeout_) {
+	return TRUE;
+}
+
+static gboolean GEvas_check(GSource *source) {
+	return TRUE;
+}
+
+static gboolean GEvas_dispatch (GSource *source, GSourceFunc  callback, gpointer user_data) {
+	ecore_main_loop_iterate ();
+	return TRUE;
+}
+
+static GSourceFuncs  Iterator_funcs = {
+	GEvas_prepare,
+	GEvas_check,
+	GEvas_dispatch,
+	NULL,
+	NULL,
+	NULL
+};
+
+void ecore_glib_main_begin (GMainContext *context) {
+	GSource *source = g_source_new(&Iterator_funcs,sizeof(GSource));
+	GMainLoop *loop =  g_main_loop_new (context,FALSE);
+	if (!context) {
+		context= g_main_context_default();
+	}
+	loop =  g_main_loop_new (context,FALSE);
+
+	g_source_attach((GSource *)source, context);
+	g_main_run(loop);
+}

Added: developers/tick/ecoreglib/ecoreglib.h
===================================================================
--- developers/tick/ecoreglib/ecoreglib.h	2008-02-13 06:59:22 UTC (rev 4061)
+++ developers/tick/ecoreglib/ecoreglib.h	2008-02-13 09:05:23 UTC (rev 4062)
@@ -0,0 +1,13 @@
+/*
+ * @Auther Tick
+ * @License GPL
+ * @brief integrate Ecore main loop into glib main loop
+ */ 
+
+#ifndef __ECORE_GLIB_MAIN_loop_H__
+#define __ECORE_GLIB_MAIN_loop_H__
+
+#include <glib.h>
+void ecore_glib_main_begin (GMainContext *context) ;
+
+#endif

Added: developers/tick/stackutil/Makefile
===================================================================
--- developers/tick/stackutil/Makefile	2008-02-13 06:59:22 UTC (rev 4061)
+++ developers/tick/stackutil/Makefile	2008-02-13 09:05:23 UTC (rev 4062)
@@ -0,0 +1,6 @@
+### File: Makefile
+CFLAGS=-finstrument-functions -g2
+CC=gcc
+
+all: 
+	gcc $(CFLAGS) -o stackdemo stackdemo.c stack_util.c

Added: developers/tick/stackutil/stack_util.c
===================================================================
--- developers/tick/stackutil/stack_util.c	2008-02-13 06:59:22 UTC (rev 4061)
+++ developers/tick/stackutil/stack_util.c	2008-02-13 09:05:23 UTC (rev 4062)
@@ -0,0 +1,131 @@
+/** @file stack_util.c
+ *  @auther Tick
+ *  @License GPL
+ */
+
+#include "stack_util.h"
+
+#include <signal.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include <stdio.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+
+
+#define _STACK_BUFFER_SIZE 4096
+void *__stack_buffer_[_STACK_BUFFER_SIZE];
+int __stack_pid_buffer[_STACK_BUFFER_SIZE];
+int __stack_buffer_index__private__ =0;
+volatile int __stack_spin_lock__=0;
+inline void dumpstack() {
+    int i,max=__stack_buffer_index__private__;
+    printf("Stack Trace:\n");
+    for (i=0;i<__stack_buffer_index__private__;i++) {
+        printf("[%3d] pid:[%3d]   0x%08x\n",i,__stack_pid_buffer[i],__stack_buffer_[i]);
+    }
+}
+
+void setSignalHandler() {
+    int ans;
+    struct sigaction act,oldact;
+    act.sa_handler=DumpStack;
+    act.sa_flags= SA_ONESHOT | SA_NOMASK;
+    //act.sa_flags= SA_RESETHAND;
+    ans=sigaction(SIGUSR1,&act,&oldact);
+    if (ans) {
+        printf("Set SIGUSR1 Failed!!!!!\n");
+        printf ("ErrorNumber: %d\n",errno);
+    }else {
+        printf("Set SIGUSR1 OK!!!!!\n");
+    }
+
+    signal(SIGHUP,SignalHandler);
+ //   signal(SIGFPE,SignalHandler);
+    signal(SIGQUIT,SignalHandler);
+    signal(SIGILL,SignalHandler);
+    signal(SIGKILL,SignalHandler);
+    signal(SIGSEGV,SignalHandler);
+    signal(SIGTERM,SignalHandler);
+    signal(SIGPWR,SignalHandler);
+}
+
+void DumpStack(int sig) {
+    struct sigaction act,oldact;
+    act.sa_handler=DumpStack;
+    act.sa_flags= SA_ONESHOT | SA_NOMASK;
+    sigaction(SIGUSR1,&act,&oldact);
+
+    printf("Stack:\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n");
+
+   printf ("Signal Type: %d\n",sig);
+   printf ("ErrorNumber: %d\n",errno);
+   printf ("PID: %d\n",getpid());
+   dumpstack();
+}
+
+void SignalHandler(int sig) {
+    if (sig==SIGTERM || sig==SIGKILL) {
+
+        //close device here
+    }
+    if (sig==SIGTERM) {
+        printf ("Signal Type: %d\n",sig);
+        printf ("PID: %d goes die\n",getpid());
+        fflush(stdout);
+        fflush(stderr);
+        sleep(1);
+        exit(0);
+    }
+
+    printf("Stack:\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n");
+
+   printf ("Signal Type: %d\n",sig);
+   printf ("ErrorNumber: %d\n",errno);
+   printf ("PID: %d\n",getpid());
+   printf ("\n");
+   dumpstack();
+   fflush(stdout);
+   fflush(stderr);
+    if (sig==SIGSEGV || sig==SIGILL) {
+        //exit(EXIT_FAILURE);
+        // If you want to kill whole tick when page fault happens 
+        // please USE "exit(EXIT_FAILURE);"
+        _exit(129);
+    }
+}
+
+
+void __cyg_profile_func_enter(void *func,void *caller) {
+    while (__stack_spin_lock__) ;
+    __stack_spin_lock__=1;
+    if (__stack_buffer_index__private__ < _STACK_BUFFER_SIZE) {
+      __stack_buffer_[__stack_buffer_index__private__]=func;
+      __stack_pid_buffer[__stack_buffer_index__private__]=getpid();
+      __stack_buffer_index__private__++;  
+    }
+    __stack_spin_lock__=0;
+}
+void __cyg_profile_func_exit(void *func,void *caller) {
+    while (__stack_spin_lock__) ;
+    __stack_spin_lock__=1;
+    int i,pid=getpid();
+    if (__stack_buffer_index__private__ > 0) {
+        for (i=__stack_buffer_index__private__-1;i >0;i--) {
+            if (__stack_pid_buffer[i]==pid) {
+                break;
+            }
+        }
+        for (;i<__stack_buffer_index__private__-1;i++) {
+            __stack_buffer_[i]=__stack_buffer_[i+1];
+            __stack_pid_buffer[i]=__stack_pid_buffer[i+1];
+        }
+        __stack_buffer_index__private__--;
+    }
+    __stack_spin_lock__=0;
+}

Added: developers/tick/stackutil/stack_util.h
===================================================================
--- developers/tick/stackutil/stack_util.h	2008-02-13 06:59:22 UTC (rev 4061)
+++ developers/tick/stackutil/stack_util.h	2008-02-13 09:05:23 UTC (rev 4062)
@@ -0,0 +1,15 @@
+/** @file stack_util.h 
+ *  @auther Tick
+ *  @License GPL
+ */
+
+#ifndef __TICK_DEMO_STACK___
+#define __TICK_DEMO_STACK___
+
+void setSignalHandler();
+void SignalHandler(int) __attribute__((__no_instrument_function__));
+void DumpStack(int sig) __attribute__((__no_instrument_function__));
+void __cyg_profile_func_enter(void *func,void *caller) __attribute__((__no_instrument_function__));
+void __cyg_profile_func_exit(void *func,void *caller) __attribute__((__no_instrument_function__));
+
+#endif

Added: developers/tick/stackutil/stackdemo.c
===================================================================
--- developers/tick/stackutil/stackdemo.c	2008-02-13 06:59:22 UTC (rev 4061)
+++ developers/tick/stackutil/stackdemo.c	2008-02-13 09:05:23 UTC (rev 4062)
@@ -0,0 +1,84 @@
+/**
+ * @file stackdemo.c
+ * @author Tick
+ * @license GPL
+ */ 
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <ctype.h>
+#include "stack_util.h"
+
+struct LALA {
+    int data;
+    int lala;
+};
+
+void run_me_will_crash_null_point () {
+    struct LALA *lala=NULL;
+    lala->lala++;
+}
+
+void run_me_will_crash_divid_zero() {
+    int a=1;
+    int b= 200/ --a;
+}
+
+void run_me_will_crash_buffer_overflow() {
+    char buf[4];
+    char *src;
+    src =(char *) malloc (64);
+    memset(src,'A',64);
+    memcpy(buf,src,64);
+}
+
+
+void prompt() {
+    printf("What way do you want to die?\n");
+    printf("1. segment fault\n");
+    printf("2. divid zero\n");
+    printf("3. buffer overflow\n");
+    printf("> ");
+}
+
+void do_die () {
+    char buf[128];
+    while(1) {
+        prompt();
+        fgets(buf,sizeof(buf),stdin);
+        if (isdigit(buf[0])) {
+            switch (buf[0]) {
+                case '1':
+                    run_me_will_crash_null_point();
+                    break;
+                case '2':
+                    run_me_will_crash_divid_zero();
+                    break;
+                case '3':
+                    run_me_will_crash_buffer_overflow();
+                    break;
+                default:
+                    continue;
+            }
+        }
+    }
+}
+
+void showmaps() {
+     char buf[128];
+    sprintf(buf,"cat /proc/%d/maps",getpid());
+    system(buf);
+}
+
+void function_D() {do_die();}
+void function_C() {function_D();}
+void function_B() {function_C();}
+void function_A() {function_B();}
+int main (void) {
+    setSignalHandler();
+    showmaps();
+    function_A();
+}
+
+





More information about the commitlog mailing list