Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
c9468bcf
Commit
c9468bcf
authored
Jun 04, 2009
by
hrothgar
Browse files
initial commit print stack trace
parent
0939d0ea
Changes
1
Show whitespace changes
Inline
Side-by-side
redis.c
View file @
c9468bcf
...
@@ -36,7 +36,10 @@
...
@@ -36,7 +36,10 @@
#include <string.h>
#include <string.h>
#include <time.h>
#include <time.h>
#include <unistd.h>
#include <unistd.h>
#define __USE_POSIX199309
#include <signal.h>
#include <signal.h>
#include <execinfo.h>
#include <ucontext.h>
#include <sys/wait.h>
#include <sys/wait.h>
#include <errno.h>
#include <errno.h>
#include <assert.h>
#include <assert.h>
...
@@ -51,6 +54,7 @@
...
@@ -51,6 +54,7 @@
#include <limits.h>
#include <limits.h>
#include <execinfo.h>
#include <execinfo.h>
#include "redis.h"
#include "ae.h" /* Event driven programming library */
#include "ae.h" /* Event driven programming library */
#include "sds.h" /* Dynamic safe strings */
#include "sds.h" /* Dynamic safe strings */
#include "anet.h" /* Networking the easy way */
#include "anet.h" /* Networking the easy way */
...
@@ -167,6 +171,12 @@
...
@@ -167,6 +171,12 @@
/* Anti-warning macro... */
/* Anti-warning macro... */
#define REDIS_NOTUSED(V) ((void) V)
#define REDIS_NOTUSED(V) ((void) V)
int die() {
char *err = NULL;
sprintf(err, "gonner");
return 0;
}
/*================================= Data types ============================== */
/*================================= Data types ============================== */
...
@@ -1594,7 +1604,8 @@ static robj *createListObject(void) {
...
@@ -1594,7 +1604,8 @@ static robj *createListObject(void) {
static robj *createSetObject(void) {
static robj *createSetObject(void) {
dict *d = dictCreate(&setDictType,NULL);
dict *d = dictCreate(&setDictType,NULL);
if (!d) oom("dictCreate");
if (!d) oom("dictCreate");
return
createObject
(
REDIS_SET
,
d
);
die();
return createObject(REDIS_SET,d);
}
}
static void freeStringObject(robj *o) {
static void freeStringObject(robj *o) {
...
@@ -4123,7 +4134,44 @@ static void daemonize(void) {
...
@@ -4123,7 +4134,44 @@ static void daemonize(void) {
}
}
}
}
static void segvHandler (int sig, siginfo_t *info, void *secret) {
void *trace[16];
char **messages = (char **)NULL;
int i, trace_size = 0;
ucontext_t *uc = (ucontext_t *)secret;
/* Do something useful with siginfo_t */
if (sig == SIGSEGV)
printf("Got signal %d, faulty address is %p, from %p\n", sig, info->si_addr,
(void *)uc->uc_mcontext.gregs[REG_EIP]);
else
printf("Got signal %d\n", sig);
trace_size = backtrace(trace, 16);
/* overwrite sigaction with caller's address */
trace[1] = (void *) uc->uc_mcontext.gregs[REG_EIP];
messages = backtrace_symbols(trace, trace_size);
/* skip first stack frame (points here) */
printf("[bt] Execution path:\n");
for (i=1; i<trace_size; ++i)
printf("[bt] %s\n", messages[i]);
exit(0);
}
void setupSigAction(){
struct sigaction act;
sigemptyset (&act.sa_mask);
/* When the SA_SIGINFO flag is set in sa_flags then sa_sigaction is used. Otherwise, sa_handler is used */
act.sa_flags = SA_NODEFER | SA_ONSTACK | SA_RESETHAND | SA_SIGINFO;
act.sa_sigaction = segvHandler;
sigaction (SIGSEGV, &act, NULL);
}
int main(int argc, char **argv) {
int main(int argc, char **argv) {
setupSigAction();
#ifdef __linux__
#ifdef __linux__
linuxOvercommitMemoryWarning();
linuxOvercommitMemoryWarning();
#endif
#endif
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment