diff -Nuarp server/main.c server.SEG/main.c
--- server/main.c 2006-01-26 19:47:59.000000000 -0800
+++ server.SEG/main.c 2006-02-21 09:14:08.000000000 -0800
@@ -165,6 +165,31 @@
#define CHAIN(e,f) { if (e>=0) { e=(f); }}
#define CHAIN_END(e,msg) { if (e<0) { report(RPT_CRIT,(msg)); exit(e); }}
+#ifndef SEG //sigsegv handler for stackdump
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <execinfo.h>
+#include <signal.h>
+#include <time.h>
+#include <fcntl.h>
+#define STACKDUMP_FILENAME "/tmp/LCDdStackDump"
+
+#ifndef DWORD
+#define DWORD unsigned long
+#endif
+
+
+int InstallSigSegvHandler();
+void SigSegvHandler(int nSig, siginfo_t *pSigInfo, void *pAddr);
+unsigned GetFreeMem( unsigned long* pTotalMem, unsigned long* pUsedMem, unsigned long* pFreeMem, unsigned long* pBuffers, unsigned long* pCached );
+
+
+struct sigaction SigTerm;
+struct sigaction SigPipe;
+struct sigaction SigSegv;
+
+#endif /*SEG*/
int
main(int argc, char **argv)
@@ -172,6 +197,10 @@
int e = 0;
pid_t parent_pid = 0;
+#ifndef SEG //sigsegv handler for stackdump
+ InstallSigSegvHandler();
+#endif /*SEG*/
+
stored_argc = argc;
stored_argv = argv;
@@ -1036,3 +1065,100 @@
* help message.
*/
}
+
+#ifndef SEG //sigsegv handler for stackdump
+int InstallSigSegvHandler()
+{
+ SigSegv.sa_sigaction = SigSegvHandler;
+ sigemptyset( &SigSegv.sa_mask );
+ SigSegv.sa_flags = SA_SIGINFO;
+
+ sigaddset (&SigSegv.sa_mask, SIGINT);
+ sigaddset (&SigSegv.sa_mask, SIGTSTP);
+ sigaddset (&SigSegv.sa_mask, SIGQUIT);
+ sigaddset (&SigSegv.sa_mask, SIGTERM);
+
+ return sigaction( SIGSEGV, &SigSegv, NULL);
+}
+
+void SigSegvHandler(int nSig, siginfo_t *pSigInfo, void *pAddr)
+{
+ void *array[50];
+ size_t size;
+ char **strings;
+ size_t i;
+
+ FILE* fd = fopen( STACKDUMP_FILENAME, "w" );
+ DWORD dwTotalMem, dwUsedMem, dwFreeMem, dwCached, dwBuffers, dwTotalFree;
+ time_t now;
+ struct tm date_time;
+ now = time(NULL);
+ date_time = *localtime(&now);
+ fprintf( fd, "Dump Created : %s",asctime(&date_time));
+
+ dwTotalFree = GetFreeMem( &dwTotalMem, &dwUsedMem, &dwFreeMem, &dwBuffers, &dwCached );
+ fprintf( fd, "Free memory %lX ......\n", dwTotalFree );
+
+ if ( pSigInfo->si_signo == SIGSEGV )
+ fprintf( fd, "Segmentation fault at Address %X ......\n", (unsigned)pSigInfo->si_addr );
+
+ switch( pSigInfo->si_code )
+ {
+ case SI_KERNEL:
+ fprintf( fd, "Sent by Kernel at Address %X ......\n", (unsigned)pSigInfo->si_addr );
+ break;
+
+ case SEGV_MAPERR:
+ fprintf( fd, "Mapping Error at Address %X ......\n", (unsigned)pSigInfo->si_addr );
+ break;
+
+ case SEGV_ACCERR:
+ fprintf( fd, "Permisson Error at Address %X ......\n", (unsigned)pSigInfo->si_addr );
+ break;
+ }
+
+ size = backtrace (array, 50);
+ strings = backtrace_symbols (array, size);
+
+ fprintf ( fd, "Obtained %d stack frames.\n", size);
+
+ for (i = 0; i < size; i++)
+ fprintf ( fd, "%s\n", strings[i]);
+
+ fclose( fd );
+ free (strings);
+ signal (nSig, SIG_DFL);
+ raise (nSig);
+}
+
+unsigned GetFreeMem( unsigned long* pTotalMem, unsigned long* pUsedMem, unsigned long* pFreeMem, unsigned long* pBuffers, unsigned long* pCached )
+{
+ char buffer[1024];
+ long garbage;
+ int nSize;
+ char* lpStr;
+ int fd = 0;
+
+ fd = open("/proc/meminfo", O_RDONLY );
+
+ if ( fd > 0 )
+ {
+ *pFreeMem = 0;
+ *pCached = 0;
+ *pBuffers = 0;
+
+ nSize = read( fd, buffer, 1024 );
+ close( fd );
+
+ lpStr = strstr( buffer, "Mem:" );
+ if ( lpStr )
+ sscanf( lpStr, "Mem: %lu %lu %lu %lu %lu %lu\n", pTotalMem, pUsedMem, pFreeMem, &garbage, pBuffers, pCached);
+ }
+ else
+ {
+ return 0;
+ }
+
+ return (*pFreeMem+*pBuffers+*pCached);
+}
+#endif /*SEG*/
syntax highlighted by Code2HTML, v. 0.9.1