पर _Unwind_Backtrace का उपयोग कर fullstacktrace पाने के लिए मैं कोड से SIGSEGV संभाल:कैसे SIGSEGV
int C()
{
int *i = NULL;
*i = 10; // Crash there
}
int B()
{
return C();
}
int A()
{
return B();
}
int main(void)
{
struct sigaction handler;
memset(&handler,0,sizeof(handler));
handler.sa_sigaction = handler_func;
handler.sa_flags = SA_SIGINFO;
sigaction(SIGSEGV,&handler,NULL);
return(C());
}
कहाँ हैंडलर कोड हैं:
static int handler_func(int signal, siginfo_t info, void* rserved)
{
const void* stack[MAX_DEPTH];
StackCrowlState state;
state.addr = stack;
state.count = MAX_DEPTH;
_Unwind_Reason_Code code = _Unwind_Backtrace(trace_func,&state);
printf("Stack trace count: %d, code: %d\n",MAX_DEPTH - state.count, code);
kill(getpid(),SIGKILL);
}
static _Unwind_Reason_Code trace_func(void* context, void* arg)
{
StackCrowlState *state = (StackCrowlState *)arg;
if(state->count>0)
{
void *ip = (void *)_Unwind_GetIP(context);
if(ip)
{
state->addr[0] = ip;
state->count--;
state->addr++;
}
}
return(_URC_NO_REASON);
}
लेकिन trace_func जहां केवल एक बार कहा जाता है, और _Unwind_Backtrace केवल पर कॉल को दर्शाता है। क्या कोड का स्टैकट्रैक प्राप्त करना संभव है जिससे SUSESEGV सिग्नल _Unwind_Backtrace का उपयोग कर सकता है?
thnx
प्लेटफार्मों कि जीसीसी उपयोग करते हैं, और इस प्रकार '_Unwind_Backtrace' है, लेकिन libc जीएनयू नहीं, और इस प्रकार' backtrace' और 'backtrace_symbols_fd' की जरूरत नहीं है पर छोड़कर। –