Есть развесистый код, который запускается из под MPI на кластере где нить так на 1000 ядрах, работает часов 7, а потом падает с сегфолтом. Собирается интеловским компилятором. Суммарно корка весит более 3Тб, откладывать ее некуда, непосредственно войти на узлы где крутиться код нельзя. Как такое ловить?
Из советов старших товарищей и гугления родилась какая то такая такая фигня:
#include <stdio.h>
#include <execinfo.h>
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/signal.h>
void my_sigsegv_handler(int signum, siginfo_t * info, void * f){
printf("bad address %p\n", info->si_addr);
void* buf[4096];
int size = backtrace(buf, 4096);
printf("backtrace(%d):\n", size);
char ** strs = backtrace_symbols(buf, size);
if(!strs) printf("error in bactrace_symbols()\n");
else for (int i = 0; i<size; ++i) printf(" %s\n", strs[i]);
free(strs);
exit(1);
}
static struct sigaction sigsegv_act;
void init_sigsegv_hook(){
memset(&sigsegv_act, 0, sizeof(sigsegv_act));
sigsegv_act.sa_sigaction = my_sigsegv_handler;
sigsegv_act.sa_flags = SA_SIGINFO;
sigaction(SIGSEGV, &sigsegv_act, NULL);
}
Хотелось бы (в идеале) получать читабельный backtrace с именами файлов исходников, именами функций и строчками кода. Еще хотелось бы как то смотреть значения некоторых (выбранных в коде) переменных, причем отладочная печать не очень подходит - логи будут здоровенные, да и тормозить будет. У нас есть технология вывода выбранных переменных поcле выкидывания (и ловли) исключения, беда в том что перехватчик сигнала если и выкидывает исключение то уже где то не там.
cast tailgunner