नहीं की आवश्यकता होती है आप उपलब्ध बीएसडी backtrace
कार्यक्षमता (लिनक्स, OSX 1.5, निश्चित रूप से बीएसडी), आप कर सकते हैं के साथ सिस्टम पर कर रहे हैं अपने सिग्नल हैंडलर में प्रोग्रामेटिक रूप से करें।
उदाहरण के लिए
(backtrace
code derived from IBM example):
#include <execinfo.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
void sig_handler(int sig)
{
void * array[25];
int nSize = backtrace(array, 25);
char ** symbols = backtrace_symbols(array, nSize);
for (int i = 0; i < nSize; i++)
{
puts(symbols[i]);;
}
free(symbols);
signal(sig, &sig_handler);
}
void h()
{
kill(0, SIGSEGV);
}
void g()
{
h();
}
void f()
{
g();
}
int main(int argc, char ** argv)
{
signal(SIGSEGV, &sig_handler);
f();
}
आउटपुट:
0 a.out 0x00001f2d sig_handler + 35
1 libSystem.B.dylib 0x95f8f09b _sigtramp + 43
2 ??? 0xffffffff 0x0 + 4294967295
3 a.out 0x00001fb1 h + 26
4 a.out 0x00001fbe g + 11
5 a.out 0x00001fcb f + 11
6 a.out 0x00001ff5 main + 40
7 a.out 0x00001ede start + 54
यह (एक जीयूआई की जरूरत नहीं को छोड़कर) वैकल्पिक सुविधाओं के लिए बोनस अंक नहीं मिलता है, तथापि, यह है बहुत सरल होने का लाभ, और किसी भी अतिरिक्त पुस्तकालयों या कार्यक्रमों की आवश्यकता नहीं है।
स्रोत
2008-08-20 17:36:55
सिग्नल हैंडलर में सी ++ का उपयोग करके - जीनोम में बग। –