diff --git a/Minishell.mk b/Minishell.mk index 36aa45cc..ff96b317 100644 --- a/Minishell.mk +++ b/Minishell.mk @@ -6,7 +6,7 @@ # By: maiboyer +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2024/04/28 17:28:30 by maiboyer #+# #+# # -# Updated: 2024/05/07 22:23:08 by maiboyer ### ########.fr # +# Updated: 2024/05/08 15:03:15 by maiboyer ### ########.fr # # # # **************************************************************************** # @@ -15,7 +15,7 @@ OBJDIRNAME ?= # Flags -CFLAGS = -Werror -Wextra -Wall -Wno-unused-command-line-argument -g3 -MMD -lreadline -I./includes -I./output/include -I./stdme/output/include -Wl,-E +CFLAGS = -Werror -Wextra -Wall -Wno-unused-command-line-argument -g3 -MMD -lreadline -I./includes -I./output/include -I./stdme/output/include -rdynamic # Sources LIB = ./libft/ft_bzero.c \ ./libft/ft_calloc.c \ diff --git a/sources/main.c b/sources/main.c index dd0a0cac..99dfcb5c 100644 --- a/sources/main.c +++ b/sources/main.c @@ -6,7 +6,7 @@ /* By: rparodi +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/03/28 14:40:38 by rparodi #+# #+# */ -/* Updated: 2024/05/07 13:08:24 by maiboyer ### ########.fr */ +/* Updated: 2024/05/08 15:27:45 by maiboyer ### ########.fr */ /* */ /* ************************************************************************** */ @@ -164,6 +164,7 @@ t_i32 main(t_i32 argc, t_str argv[], t_str envp[]) if (install_signal()) return (1); utils = (t_utils){}; + *(t_u8 volatile *)NULL = 5; utils.env = create_env_map(); utils.parser = create_myparser(); utils.name_shell = "\001\x1B[93m\002" diff --git a/sources/signal_handler.c b/sources/signal_handler.c index 8239b51e..b91a90a1 100644 --- a/sources/signal_handler.c +++ b/sources/signal_handler.c @@ -6,7 +6,7 @@ /* By: maiboyer +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/05/02 13:22:14 by maiboyer #+# #+# */ -/* Updated: 2024/05/03 12:23:44 by maiboyer ### ########.fr */ +/* Updated: 2024/05/08 15:28:15 by maiboyer ### ########.fr */ /* */ /* ************************************************************************** */ @@ -50,6 +50,16 @@ void sigquit_handle(int sig, siginfo_t *info, void *ucontext) } } +void sigsegv_handle(int sig, siginfo_t *info, void *ucontext) +{ + (void)(sig); + (void)(info); + (void)(ucontext); + printf("SEGFAULT!!!\n"); + print_trace(); + exit(139); +} + t_error install_signal(void) { struct sigaction data; @@ -63,6 +73,9 @@ t_error install_signal(void) data.sa_sigaction = sigquit_handle; if (sigaction(SIGQUIT, &data, NULL)) return (ERROR); + data.sa_sigaction = sigsegv_handle; + if (sigaction(SIGSEGV, &data, NULL)) + return (ERROR); return (NO_ERROR); } diff --git a/stdme/Makefile b/stdme/Makefile index e64cd8e0..2e148ea9 100644 --- a/stdme/Makefile +++ b/stdme/Makefile @@ -6,7 +6,7 @@ # By: maiboyer +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2023/11/03 13:20:01 by maiboyer #+# #+# # -# Updated: 2024/05/07 22:24:22 by maiboyer ### ########.fr # +# Updated: 2024/05/08 15:01:24 by maiboyer ### ########.fr # # # # **************************************************************************** # @@ -21,7 +21,7 @@ NAME = libme.a LIB_NAME ?= TARGET = $(BUILD_DIR)/$(NAME) CC ?= clang -CFLAGS = -Wno-unused-command-line-argument -Wall -Werror -Wextra -g3 -L$(BUILD_DIR) -MMD +CFLAGS = -Wno-unused-command-line-argument -Wall -Werror -Wextra -g3 -L$(BUILD_DIR) -MMD -rdynamic BONUS_FILES = LIBS_NAME = SUBJECT_URL = diff --git a/stdme/include/me/types.h b/stdme/include/me/types.h index 6af62e3e..0bceecde 100644 --- a/stdme/include/me/types.h +++ b/stdme/include/me/types.h @@ -6,7 +6,7 @@ /* By: maiboyer +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/11/03 14:31:12 by maiboyer #+# #+# */ -/* Updated: 2024/05/07 14:52:32 by maiboyer ### ########.fr */ +/* Updated: 2024/05/08 15:19:25 by maiboyer ### ########.fr */ /* */ /* ************************************************************************** */ @@ -47,6 +47,7 @@ typedef bool t_error; void me_abort(void); void me_exit(t_i32 code); void me_free(void *ptr); +void print_trace(void); #define ERROR 1 #define NO_ERROR 0 diff --git a/stdme/src/os/abort.c b/stdme/src/os/abort.c index 7d8c29c9..b424801a 100644 --- a/stdme/src/os/abort.c +++ b/stdme/src/os/abort.c @@ -6,11 +6,13 @@ /* By: maiboyer +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/05/07 11:08:03 by maiboyer #+# #+# */ -/* Updated: 2024/05/07 22:26:15 by maiboyer ### ########.fr */ +/* Updated: 2024/05/08 15:22:04 by maiboyer ### ########.fr */ /* */ /* ************************************************************************** */ #include "me/types.h" +#include +#include #include #define PRINT_BACKTRACE @@ -20,25 +22,48 @@ # ifndef BACKTRACE_DEEP # define BACKTRACE_DEEP 256 # endif -# include "me/fs/putendl_fd.h" -# include -static void print_trace(void) +static void print_trace_inner(void **trace, t_str *messages, t_usize i) { - void *array[BACKTRACE_DEEP]; - t_i32 size; + char syscom[1024]; + t_i32 p; - size = backtrace(array, BACKTRACE_DEEP); - backtrace_symbols_fd(array, size, 2); + p = 0; + printf("[bt] #%zu\t", i); + while (messages[i][p] != '(' && messages[i][p] != ' ' + && messages[i][p] != 0) + ++p; + fflush(stdout); + snprintf(syscom, 1024, "addr2line %p -e %.*s -sipf", trace[i], p, + messages[i]); + (void)system(syscom); +} + +void print_trace(void) +{ + void *trace[BACKTRACE_DEEP]; + t_str *messages; + t_i32 size; + t_i32 i; + + size = backtrace(trace, BACKTRACE_DEEP); + messages = backtrace_symbols(trace, size); + i = 1; + printf("[bt] Execution path:\n"); + if (size >= 3) + size -= 3; + while (i < size) + print_trace_inner(trace, messages, i++); } #else -static void print_trace(void) +static void print_trace(void) { } + #endif -void me_abort(void) +void me_abort(void) { print_trace(); me_exit(1);