void watch_signal() { //signal(SIGSEGV, signal_handler); struct sigaction act; sigemptyset(&act.sa_mask); act.sa_flags = SA_SIGINFO | SA_RESETHAND; act.sa_sigaction = signal_handler; sigaction(SIGSEGV, &act, NULL); }
时间: 2023-06-17 11:06:37 浏览: 154
这段代码是用来注册一个信号处理函数(signal handler)来处理程序收到 SIGSEGV 信号的情况。SIGSEGV 信号通常表示程序访问了一个非法内存地址,或者试图写入只读内存等错误情况。在这种情况下,操作系统会向程序发送SIGSEGV信号,如果程序没有注册信号处理函数,那么就会直接崩溃退出。
这段代码的作用是在程序运行时,当程序收到 SIGSEGV 信号时,会执行signal_handler 函数来处理这个信号。在这个函数中,你可以对这个错误进行处理,比如记录日志,打印错误信息,或者进行内存保护等操作,以保证程序能够正常运行下去。
相关问题
void dump_backtrace() { void* buffer[200]; int size = backtrace(buffer, sizeof(buffer)); printf("\nbacktrace() returned %d addresses\n", size); char ** info = backtrace_symbols(buffer, size); for (int i=0; i<size; ++i) fprintf(stderr, "[%02d] %s\n", i, info[i]); free(info); exit(0); } void dump_library_maps() { printf("dynamic library maps:\n"); char maps[128] = {0x00}; snprintf(maps, sizeof(maps), "cat /proc/%d/maps", getpid()); system(maps); } void signal_handler(int signo, siginfo_t *info, void *ucontext) { printf("\n=========>>>catch signal %d <<<=========\n", signo); printf("trigger address: %p\n\n", info->si_addr); printf("************* backtrace ******************\n"); dump_library_maps(); printf("\n"); dump_backtrace(); printf("***************backtrace end********************\n"); //signal(signo, SIG_DFL); //恢复默认处理 raise(signo); //再发一次信号 } void watch_signal() { //signal(SIGSEGV, signal_handler); struct sigaction act; sigemptyset(&act.sa_mask); act.sa_flags = SA_SIGINFO | SA_RESETHAND; act.sa_sigaction = signal_handler; sigaction(SIGSEGV, &act, NULL); }
这段代码实现了一个信号处理函数signal_handler,当程序发生段错误信号SIGSEGV时,会调用该函数。signal_handler函数会打印出触发信号的地址,以及通过backtrace函数获取的函数调用栈信息。同时,还会通过system函数执行cat /proc/%d/maps命令,打印出当前进程的动态库加载信息。最后,函数会再次调用raise函数,重新触发SIGSEGV信号,使程序立即退出。watch_signal函数则是用来注册SIGSEGV信号的处理函数。
阅读全文