1 diff -Nuarp server/main.c server.SEG/main.c
2 --- server/main.c 2006-01-26 19:47:59.000000000 -0800
3 +++ server.SEG/main.c 2006-02-21 09:14:08.000000000 -0800
5 #define CHAIN(e,f) { if (e>=0) { e=(f); }}
6 #define CHAIN_END(e,msg) { if (e<0) { report(RPT_CRIT,(msg)); exit(e); }}
8 +#ifndef SEG //sigsegv handler for stackdump
12 +#include <execinfo.h>
16 +#define STACKDUMP_FILENAME "/tmp/LCDdStackDump"
19 +#define DWORD unsigned long
23 +int InstallSigSegvHandler();
24 +void SigSegvHandler(int nSig, siginfo_t *pSigInfo, void *pAddr);
25 +unsigned GetFreeMem( unsigned long* pTotalMem, unsigned long* pUsedMem, unsigned long* pFreeMem, unsigned long* pBuffers, unsigned long* pCached );
28 +struct sigaction SigTerm;
29 +struct sigaction SigPipe;
30 +struct sigaction SigSegv;
35 main(int argc, char **argv)
40 +#ifndef SEG //sigsegv handler for stackdump
41 + InstallSigSegvHandler();
47 @@ -1036,3 +1065,100 @@
52 +#ifndef SEG //sigsegv handler for stackdump
53 +int InstallSigSegvHandler()
55 + SigSegv.sa_sigaction = SigSegvHandler;
56 + sigemptyset( &SigSegv.sa_mask );
57 + SigSegv.sa_flags = SA_SIGINFO;
59 + sigaddset (&SigSegv.sa_mask, SIGINT);
60 + sigaddset (&SigSegv.sa_mask, SIGTSTP);
61 + sigaddset (&SigSegv.sa_mask, SIGQUIT);
62 + sigaddset (&SigSegv.sa_mask, SIGTERM);
64 + return sigaction( SIGSEGV, &SigSegv, NULL);
67 +void SigSegvHandler(int nSig, siginfo_t *pSigInfo, void *pAddr)
74 + FILE* fd = fopen( STACKDUMP_FILENAME, "w" );
75 + DWORD dwTotalMem, dwUsedMem, dwFreeMem, dwCached, dwBuffers, dwTotalFree;
77 + struct tm date_time;
79 + date_time = *localtime(&now);
80 + fprintf( fd, "Dump Created : %s",asctime(&date_time));
82 + dwTotalFree = GetFreeMem( &dwTotalMem, &dwUsedMem, &dwFreeMem, &dwBuffers, &dwCached );
83 + fprintf( fd, "Free memory %lX ......\n", dwTotalFree );
85 + if ( pSigInfo->si_signo == SIGSEGV )
86 + fprintf( fd, "Segmentation fault at Address %X ......\n", (unsigned)pSigInfo->si_addr );
88 + switch( pSigInfo->si_code )
91 + fprintf( fd, "Sent by Kernel at Address %X ......\n", (unsigned)pSigInfo->si_addr );
95 + fprintf( fd, "Mapping Error at Address %X ......\n", (unsigned)pSigInfo->si_addr );
99 + fprintf( fd, "Permisson Error at Address %X ......\n", (unsigned)pSigInfo->si_addr );
103 + size = backtrace (array, 50);
104 + strings = backtrace_symbols (array, size);
106 + fprintf ( fd, "Obtained %d stack frames.\n", size);
108 + for (i = 0; i < size; i++)
109 + fprintf ( fd, "%s\n", strings[i]);
113 + signal (nSig, SIG_DFL);
117 +unsigned GetFreeMem( unsigned long* pTotalMem, unsigned long* pUsedMem, unsigned long* pFreeMem, unsigned long* pBuffers, unsigned long* pCached )
125 + fd = open("/proc/meminfo", O_RDONLY );
133 + nSize = read( fd, buffer, 1024 );
136 + lpStr = strstr( buffer, "Mem:" );
138 + sscanf( lpStr, "Mem: %lu %lu %lu %lu %lu %lu\n", pTotalMem, pUsedMem, pFreeMem, &garbage, pBuffers, pCached);
145 + return (*pFreeMem+*pBuffers+*pCached);