Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
#include <stdio.h>
#include <execinfo.h>
#include <inttypes.h>
void print_backtrace(void) {
void* buf[64];
int size = backtrace(buf, 64);
printf("backtrace(%d):\n", size);
for (int i = 0; i < size; ++i)
printf(" %lx\n", (unsigned long)buf[i]);
}
void f(void) {
print_backtrace();
}
int main(void) {
f();
return 0;
}
arm-unknown-linux-gnueabi-g++ zz.cc -o zz -O0 -march=armv7-a
backtrace(4):
84ec
8574
8588
4027cc3a
#include "тут был инклюд"
#include "тут тоже был инклюд"
#include "тут снова был инклюд"
int memento(){
int a=0;
printf("Ooops\n");
return 0;
}
void fall(){
int* p = 0;
p[5] = 13;
printf("p=%d\n", p[5]);
}
void posix_death_signal(int signum){
memento();
signal(signum, SIG_DFL);
}
int main(int argc, char *argv[]){
signal(SIGSEGV, posix_death_signal);
fall();
}
вы можете уронить программу в любом потоке, обработчик запустится в любом случае
$ ./a.out n=0 Ooops segfault in thread 3 n=0 Ooops segfault in thread 4 Ошибка сегментирования $ ./a.out n=0 Ooops segfault in thread 1 n=0 Ошибка сегментирования $ ./a.out Ooops segfault in thread 1 n=0 n=0 Ошибка сегментирования $ ./a.out Ooops segfault in thread 1 n=0 n=0 Ошибка сегментирования
int fall()
{
QMainWindow w;
w.show();
}
#include "stdio.h"
#include "conio.h"
#include "signal.h"
#include "setjmp.h"
void CatchSIGFPE(void);
jmp_buf jmp_bufWatchoutIntDiv0; /*storage of the program state, including execution point.*/
/*you can dump it to external file for later analysis.*/
int main(int argc, char* argv[])
{
int nA, nB, nC;
float sA, sB, sC;
/*installing handlers first time.*/
signal(SIGFPE, CatchSIGFPE);
nA = 1; nB = 1; nC = 0;
sA = 1.0; sB = 1.0; sC = 0.0;
/*we don't raise the exception ourselves, but the division actually does it.*/
if ( !setjmp(jmp_bufWatchoutIntDiv0) )
nA = nB / nC; /*raises exception SIGFPE.*/
else
nA = 0, printf("\nNah, checked that, but it scared me! I set result of division to 0.");
/*checking wether exception catcher is still in our hands.*/
if ( !setjmp(jmp_bufWatchoutIntDiv0) )
sA = sB / sC; /*raises exception SIGFPE.*/
else
sA = 0, printf("\nAgain, I was close to crash! I set result to zero one more time.");
printf("\nWOW!.. That was fun! :-)");
printf("\nPress any key...");
getch();
return 0;
};
void CatchSIGFPE(void)
{
signal(SIGFPE, CatchSIGFPE);
fprintf(stderr, "\n>SIGFPE caught!");
longjmp(jmp_bufWatchoutIntDiv0, 1);
};
Общий синтаксис обработки исключений выглядит следующим образом:
Обратите внимание на ключевое слово __except. За блоком try всегда должен следовать либо блок finally, либо блок except. Для данного блока try нельзя указать одновременно и блок finally, и блок except; к тому же за try не может следовать несколько блоков finally или except. Однако try-finally можно вложить в try-except, и наоборот.
Обработка Segmentation Fault в C++