From 4611af50d6db1dd8ee089cb3d3846c82d8fffd90 Mon Sep 17 00:00:00 2001 From: Karol Lewandowski Date: Thu, 10 Oct 2019 13:31:58 +0200 Subject: [PATCH] Drop sys-assert It's been deprecated for long time. Change-Id: I0f5623cbf2ef32c9630d853ead61a6e92bfa27b2 --- packaging/crash-worker.spec | 29 -- src/crash-manager/crash-manager.c | 58 --- src/sys-assert/CMakeLists.txt | 64 --- src/sys-assert/arm/backtrace.c | 48 -- src/sys-assert/arm/context.c | 60 --- src/sys-assert/arm_64/backtrace.c | 48 -- src/sys-assert/arm_64/context.c | 94 ---- src/sys-assert/sys-assert.c | 851 ----------------------------------- src/sys-assert/sys-assert.conf.in | 2 - src/sys-assert/sys-assert.h | 61 --- src/sys-assert/util.c | 118 ----- src/sys-assert/util.h | 30 -- src/sys-assert/x86/backtrace.c | 56 --- src/sys-assert/x86/context.c | 56 --- src/sys-assert/x86/sys-assert-regs.h | 99 ---- 15 files changed, 1674 deletions(-) delete mode 100644 src/sys-assert/CMakeLists.txt delete mode 100644 src/sys-assert/arm/backtrace.c delete mode 100644 src/sys-assert/arm/context.c delete mode 100644 src/sys-assert/arm_64/backtrace.c delete mode 100644 src/sys-assert/arm_64/context.c delete mode 100644 src/sys-assert/sys-assert.c delete mode 100644 src/sys-assert/sys-assert.conf.in delete mode 100755 src/sys-assert/sys-assert.h delete mode 100644 src/sys-assert/util.c delete mode 100644 src/sys-assert/util.h delete mode 100644 src/sys-assert/x86/backtrace.c delete mode 100644 src/sys-assert/x86/context.c delete mode 100644 src/sys-assert/x86/sys-assert-regs.h diff --git a/packaging/crash-worker.spec b/packaging/crash-worker.spec index 24c7ae8..fc64bba 100644 --- a/packaging/crash-worker.spec +++ b/packaging/crash-worker.spec @@ -5,7 +5,6 @@ %define _with_livedumper on %define _with_crashservice on %bcond_with doc -%bcond_with sys_assert %bcond_with tests %bcond_with livedumper %bcond_with crashservice @@ -133,7 +132,6 @@ export CFLAGS+=" -Werror" -DCRASH_POPUP_BIN_PATH=%{_libexecdir}/crash-popup-launch \ -DCRASH_NOTIFY_BIN_PATH=%{_libexecdir}/crash-notify-send \ -DCRASH_TESTS_PATH=%{_libdir}/crash-worker-tests \ - -DSYS_ASSERT=%{on_off sys_assert} \ -DLIVEDUMPER=%{on_off livedumper} \ -DCRASH_SERVICE=%{on_off crashservice} \ -DUPGRADE_SCRIPT_PATH=%{upgrade_script_path} \ @@ -153,31 +151,9 @@ mkdir -p %{buildroot}%{crash_path} mkdir -p %{buildroot}%{crash_temp} %post -%if %{with sys_assert} -if [ ! -d /.build ]; then - orig="%{_libdir}/libsys-assert.so" - pattern=$(echo $orig | sed -e 's|/|\\/|g') - ret=$(sed -n "/${pattern}/p" %{_sysconfdir}/ld.so.preload) - if [ -z "$ret" ]; then - echo "%{_libdir}/libsys-assert.so" >> %{_sysconfdir}/ld.so.preload - fi - chmod 644 %{_sysconfdir}/ld.so.preload -fi - -/sbin/ldconfig -%endif - /usr/bin/chsmack -a "System" -t %{crash_path} /usr/bin/chsmack -a "System" -t %{crash_temp} -%postun -%if %{with sys_assert} -orig="%{_libdir}/libsys-assert.so" -pattern=$(echo $orig | sed -e 's|/|\\/|g') -sed -i "/${pattern}/D" %{_sysconfdir}/ld.so.preload -/sbin/ldconfig -%endif - %files %license LICENSE LICENSE.BSD %manifest crash-worker.manifest @@ -204,11 +180,6 @@ sed -i "/${pattern}/D" %{_sysconfdir}/ld.so.preload %{_libdir}/libcrash-service.so.* %endif -%if %{with sys_assert} -%{_libdir}/libsys-assert.so -%{_sysconfdir}/tmpfiles.d/sys-assert.conf -%endif - #upgrade script %attr(-,root,root) %{upgrade_script_path}/500.crash-manager-upgrade.sh diff --git a/src/crash-manager/crash-manager.c b/src/crash-manager/crash-manager.c index 9714a6d..a96342e 100644 --- a/src/crash-manager/crash-manager.c +++ b/src/crash-manager/crash-manager.c @@ -411,14 +411,6 @@ bool set_crash_info(struct crash_info *cinfo) goto rm_temp; } -#ifdef SYS_ASSERT - if (asprintf(&cinfo->sysassert_cs_path, "/tmp/crash_stack/%s_%d.info", - basename(cinfo->cmd_line), cinfo->pid_info) == -1) { - _E("Failed to snprintf for sys-assert callstack path"); - cinfo->sysassert_cs_path = NULL; - goto rm_temp; - } -#endif if (set_prstatus(cinfo) < 0) goto rm_temp; @@ -437,37 +429,6 @@ rm_temp: return false; } -#ifdef SYS_ASSERT -static int get_sysassert_cs(struct crash_info *cinfo) -{ - int ret; - char move_path[PATH_MAX]; - - if (access(cinfo->sysassert_cs_path, F_OK)) { - _E("The sys-assert cs file not found: %s: %m", - cinfo->sysassert_cs_path); - cinfo->have_sysassert_report = 0; - return -1; - } else - cinfo->have_sysassert_report = 1; - - ret = snprintf(move_path, sizeof(move_path), "%s/%s", - cinfo->pfx, basename(cinfo->sysassert_cs_path)); - if (ret < 0) { - _E("Failed to snprintf for move path"); - return -1; - } - - if (move_file(move_path, cinfo->sysassert_cs_path) < 0) { - _E("Failed to move %s to %s", - cinfo->sysassert_cs_path, move_path); - return -1; - } - - return 0; -} -#endif - static void launch_crash_popup(struct crash_info *cinfo) { assert(cinfo); @@ -767,12 +728,6 @@ static bool execute_crash_modules(struct crash_info *cinfo) } } -#ifdef SYS_ASSERT - /* Use process_vm_readv() version as fallback if sys-assert - * failed to generate report */ - if (cinfo->have_sysassert_report) - return false; -#endif execute_crash_stack(cinfo, NULL); if (cinfo->livedump) process_continue(cinfo->pid_info); @@ -1089,10 +1044,6 @@ static void free_crash_info(struct crash_info *cinfo) free(cinfo->info_path); free(cinfo->core_path); free(cinfo->log_path); - -#ifdef SYS_ASSERT - free(cinfo->sysassert_cs_path); -#endif } void crash_info_init(struct crash_info *cinfo) @@ -1112,10 +1063,6 @@ void crash_info_init(struct crash_info *cinfo) cinfo->info_path = NULL; cinfo->core_path = NULL; cinfo->log_path = NULL; - -#ifdef SYS_ASSERT - cinfo->sysassert_cs_path = NULL; -#endif } static bool run(struct crash_info *cinfo) @@ -1124,11 +1071,6 @@ static bool run(struct crash_info *cinfo) static pid_t dump_state_pid = 0, extra_script_pid = 0; int debug_mode = access(DEBUGMODE_PATH, F_OK) == 0; -#ifdef SYS_ASSERT - /* Fetch callstack of sys-assert */ - get_sysassert_cs(cinfo); -#endif - if (config.report_type >= REP_TYPE_FULL) { /* Exec dump_systemstate */ if (!dump_system_state(cinfo, &dump_state_pid)) { diff --git a/src/sys-assert/CMakeLists.txt b/src/sys-assert/CMakeLists.txt deleted file mode 100644 index 99d3383..0000000 --- a/src/sys-assert/CMakeLists.txt +++ /dev/null @@ -1,64 +0,0 @@ -CMAKE_MINIMUM_REQUIRED(VERSION 2.6) - -SET(LIBNAME sys-assert) -SET(SRCS - sys-assert.c - util.c -) - -#arm -IF("${ARCH}" STREQUAL "arm") -IF("${ARCH_BIT}" STREQUAL "32") - SET(SRCS ${SRCS} - arm/context.c - arm/backtrace.c - ) -ENDIF("${ARCH_BIT}" STREQUAL "32") -IF("${ARCH_BIT}" STREQUAL "64") - SET(SRCS ${SRCS} - arm_64/context.c - arm_64/backtrace.c - ) -ENDIF("${ARCH_BIT}" STREQUAL "64") -ADD_DEFINITIONS("-DARCH_ARM") -ENDIF("${ARCH}" STREQUAL "arm") - -#x86 -IF("${ARCH}" STREQUAL "x86") - SET(SRCS ${SRCS} - x86/context.c - x86/backtrace.c - ) -ENDIF("${ARCH}" STREQUAL "x86") - -IF("${ARCH_BIT}" STREQUAL "64") -ADD_DEFINITIONS("-DARCH_64") -ENDIF("${ARCH_BIT}" STREQUAL "64") - -INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) - -INCLUDE(FindPkgConfig) -pkg_check_modules(sys-assert_pkgs REQUIRED libtzplatform-config libunwind) - -FOREACH(flag ${sys-assert_pkgs_CFLAGS}) - SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") -ENDFOREACH(flag) - -SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") -SET(CMAKE_C_FLAGS_DEBUG "-O0 -g") -SET(CMAKE_C_FLAGS_RELEASE "-O2") - -FIND_PROGRAM(UNAME NAMES uname) -EXEC_PROGRAM("${UNAME}" ARGS "-m" OUTPUT_VARIABLE "ARCH") -IF("${ARCH}" STREQUAL "arm") - ADD_DEFINITIONS("-DTARGET") - MESSAGE("add -DTARGET") -ENDIF("${ARCH}" STREQUAL "arm") - -ADD_LIBRARY(${LIBNAME} SHARED ${SRCS}) -TARGET_LINK_LIBRARIES(${LIBNAME} ${sys-assert_pkgs_LDFLAGS} -ldl) - -INSTALL(TARGETS ${LIBNAME} LIBRARY DESTINATION ${LIB_INSTALL_DIR}) - -CONFIGURE_FILE(sys-assert.conf.in sys-assert.conf) -INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/sys-assert.conf DESTINATION ${TMP_FILES_DIR}) diff --git a/src/sys-assert/arm/backtrace.c b/src/sys-assert/arm/backtrace.c deleted file mode 100644 index 2d1241a..0000000 --- a/src/sys-assert/arm/backtrace.c +++ /dev/null @@ -1,48 +0,0 @@ -/* - * SYS-ASSERT - * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include -#include -#include -#include "util.h" - -int dump_callstack(void **callstack_addrs, int size, void *context, int retry) -{ - ucontext_t *ucontext = context; - int count; - - if (!callstack_addrs) - return 0; - - if (!retry && (context && ((int)ucontext->uc_mcontext.arm_pc != 0))) - count = unw_backtrace(callstack_addrs, size); - else - count = backtrace(callstack_addrs, size); - - if (count > CALLSTACK_BASE) { - count -= CALLSTACK_BASE; - } else if (context) { - callstack_addrs[CALLSTACK_BASE] = (long *)ucontext->uc_mcontext.arm_pc; - callstack_addrs[CALLSTACK_BASE] = (long *)ucontext->uc_mcontext.arm_lr; - count = 2; - } else { - count = 0; - } - return count; -}; diff --git a/src/sys-assert/arm/context.c b/src/sys-assert/arm/context.c deleted file mode 100644 index ec59f9e..0000000 --- a/src/sys-assert/arm/context.c +++ /dev/null @@ -1,60 +0,0 @@ -/* - * SYS-ASSERT - * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include -#include "sys-assert.h" -#include "util.h" - -#define CRASH_REGISTERINFO_TITLE "Register Information" - -void dump_registers(int fd, void *context) -{ - ucontext_t *ucontext = context; - /* for context info */ - if (!context) - return; - - fprintf_fd(fd, "\n%s\n", CRASH_REGISTERINFO_TITLE); - fprintf_fd(fd, - "r0 = 0x%08x, r1 = 0x%08x\nr2 = 0x%08x, r3 = 0x%08x\n", - ucontext->uc_mcontext.arm_r0, - ucontext->uc_mcontext.arm_r1, - ucontext->uc_mcontext.arm_r2, - ucontext->uc_mcontext.arm_r3); - fprintf_fd(fd, - "r4 = 0x%08x, r5 = 0x%08x\nr6 = 0x%08x, r7 = 0x%08x\n", - ucontext->uc_mcontext.arm_r4, - ucontext->uc_mcontext.arm_r5, - ucontext->uc_mcontext.arm_r6, - ucontext->uc_mcontext.arm_r7); - fprintf_fd(fd, - "r8 = 0x%08x, r9 = 0x%08x\nr10 = 0x%08x, fp = 0x%08x\n", - ucontext->uc_mcontext.arm_r8, - ucontext->uc_mcontext.arm_r9, - ucontext->uc_mcontext.arm_r10, - ucontext->uc_mcontext.arm_fp); - fprintf_fd(fd, - "ip = 0x%08x, sp = 0x%08x\nlr = 0x%08x, pc = 0x%08x\n", - ucontext->uc_mcontext.arm_ip, - ucontext->uc_mcontext.arm_sp, - ucontext->uc_mcontext.arm_lr, - ucontext->uc_mcontext.arm_pc); - fprintf_fd(fd, "cpsr = 0x%08x\n", - ucontext->uc_mcontext.arm_cpsr); -}; diff --git a/src/sys-assert/arm_64/backtrace.c b/src/sys-assert/arm_64/backtrace.c deleted file mode 100644 index 21a10d4..0000000 --- a/src/sys-assert/arm_64/backtrace.c +++ /dev/null @@ -1,48 +0,0 @@ -/* - * SYS-ASSERT - * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include -#include -#include -#include "util.h" - -int dump_callstack(void **callstack_addrs, int size, void *context, int retry) -{ - ucontext_t *ucontext = context; - int count; - - if (!callstack_addrs) - return 0; - - if (!retry && (context && ((int)ucontext->uc_mcontext.pc != 0))) - count = unw_backtrace(callstack_addrs, size); - else - count = backtrace(callstack_addrs, size); - - if (count > CALLSTACK_BASE) { - count -= CALLSTACK_BASE; - } else if (context) { - callstack_addrs[CALLSTACK_BASE] = (long *)ucontext->uc_mcontext.pc; - callstack_addrs[CALLSTACK_BASE] = (long *)ucontext->uc_mcontext.regs[30]; /* LR (link register) */ - count = 2; - } else { - count = 0; - } - return count; -}; diff --git a/src/sys-assert/arm_64/context.c b/src/sys-assert/arm_64/context.c deleted file mode 100644 index 9416eb8..0000000 --- a/src/sys-assert/arm_64/context.c +++ /dev/null @@ -1,94 +0,0 @@ -/* - * SYS-ASSERT - * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include -#include "sys-assert.h" -#include "util.h" - -#define CRASH_REGISTERINFO_TITLE "Register Information" - -void dump_registers(int fd, void *context) -{ - ucontext_t *ucontext = context; - - /* for context info */ - if (!context) - return; - - fprintf_fd(fd, "\n%s\n", CRASH_REGISTERINFO_TITLE); - fprintf_fd(fd, - "x0 = 0x%08x, x1 = 0x%08x\nx2 = 0x%08x, x3 = 0x%08x\n", - ucontext->uc_mcontext.regs[0], - ucontext->uc_mcontext.regs[1], - ucontext->uc_mcontext.regs[2], - ucontext->uc_mcontext.regs[3]); - fprintf_fd(fd, - "x4 = 0x%08x, x5 = 0x%08x\nx6 = 0x%08x, x7 = 0x%08x\n", - ucontext->uc_mcontext.regs[4], - ucontext->uc_mcontext.regs[5], - ucontext->uc_mcontext.regs[6], - ucontext->uc_mcontext.regs[7]); - fprintf_fd(fd, - "x8 = 0x%08x, x9 = 0x%08x\nx10 = 0x%08x, x11 = 0x%08x\n", - ucontext->uc_mcontext.regs[8], - ucontext->uc_mcontext.regs[9], - ucontext->uc_mcontext.regs[10], - ucontext->uc_mcontext.regs[11]); - fprintf_fd(fd, - "x12 = 0x%08x, x13 = 0x%08x\nx14 = 0x%08x, x15 = 0x%08x\n", - ucontext->uc_mcontext.regs[12], - ucontext->uc_mcontext.regs[13], - ucontext->uc_mcontext.regs[14], - ucontext->uc_mcontext.regs[15]); - fprintf_fd(fd, - "x16 = 0x%08x, x17 = 0x%08x\nx18 = 0x%08x, x19 = 0x%08x\n", - ucontext->uc_mcontext.regs[16], - ucontext->uc_mcontext.regs[17], - ucontext->uc_mcontext.regs[18], - ucontext->uc_mcontext.regs[19]); - fprintf_fd(fd, - "x20 = 0x%08x, x21 = 0x%08x\nx22 = 0x%08x, x23 = 0x%08x\n", - ucontext->uc_mcontext.regs[20], - ucontext->uc_mcontext.regs[21], - ucontext->uc_mcontext.regs[22], - ucontext->uc_mcontext.regs[23]); - fprintf_fd(fd, - "x24 = 0x%08x, x25 = 0x%08x\nx26 = 0x%08x, x27 = 0x%08x\n", - ucontext->uc_mcontext.regs[24], - ucontext->uc_mcontext.regs[25], - ucontext->uc_mcontext.regs[26], - ucontext->uc_mcontext.regs[27]); - fprintf_fd(fd, - "x28 = 0x%08x, x29 = 0x%08x\nx30 = 0x%08x\n", - ucontext->uc_mcontext.regs[28], - ucontext->uc_mcontext.regs[29], - ucontext->uc_mcontext.regs[30]); - fprintf_fd(fd, - "xr = 0x%08x, ip0 = 0x%08x\nip1 = 0x%08x, pr = 0x%08x\n", - ucontext->uc_mcontext.regs[8], /* Indirect result location register */ - ucontext->uc_mcontext.regs[16], /* Intra-procedure call scratch register 0 */ - ucontext->uc_mcontext.regs[17], /* Intra-procedure call scratch register 1 */ - ucontext->uc_mcontext.regs[18]); /* Platform register */ - fprintf_fd(fd, - "fp = 0x%08x, lr = 0x%08x\npc = 0x%08x, sp = 0x%08x\n", - ucontext->uc_mcontext.regs[29], /* Frame register */ - ucontext->uc_mcontext.regs[30], /* Procedure link register */ - ucontext->uc_mcontext.pc, /* Program counter */ - ucontext->uc_mcontext.sp); /* Stack pointer */ -}; diff --git a/src/sys-assert/sys-assert.c b/src/sys-assert/sys-assert.c deleted file mode 100644 index 5af44ff..0000000 --- a/src/sys-assert/sys-assert.c +++ /dev/null @@ -1,851 +0,0 @@ -/* - * SYS-ASSERT - * Copyright (c) 2012-2016 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "sys-assert.h" -#include "util.h" - -#define CMDLINE_PATH "/proc/self/cmdline" -#define EXE_PATH "/proc/self/exe" -#define MAPS_PATH "/proc/self/maps" -#define MEMINFO_PATH "/proc/meminfo" -#define VERINFO_PATH "/etc/info.ini" -#define STATUS_PATH "/proc/self/status" -#define TASK_PATH "/proc/self/task" - -#define CRASH_INFO_PATH "/tmp/crash_stack" -#define CRASH_SOCKET "/tmp/crash_socket" -#define CRASH_SOCKET_PATH_LEN 17 - -#define CRASH_CALLSTACKINFO_TITLE "Callstack Information" -#define CRASH_CALLSTACKINFO_TITLE_E "End of Call Stack" -#define CRASH_MAPSINFO_TITLE "Maps Information" -#define CRASH_MAPSINFO_TITLE_E "End of Maps Information" -#define CRASH_MEMINFO_TITLE "Memory Information" -#define CRASH_THREADINFO_TITLE "Threads Information" - -#define STR_ANONY "[anony]" -#define STR_ANNOY_LEN 8 - -#define HEXA 16 -#define PERM_LEN 5 -#define PERM_LEN_DEC 4 -#ifdef ARCH_64 -#define ADDR_LEN 10 -#define ADDR_BUF_LEN 22 -#define ADDR_BUF_LEN_DEC 21 -#else -#define ADDR_LEN 8 -#define ADDR_BUF_LEN 18 -#define ADDR_BUF_LEN_DEC 17 -#endif -#define INFO_LEN 20 -#define INFO_LEN_DEC 19 -#define VALUE_LEN 24 -#define VALUE_LEN_DEC 23 -#define TIME_MAX_LEN 64 -#define FILE_LEN 255 -#define BUF_SIZE (BUFSIZ) -#define CALLSTACK_SIZE 100 -#define FUNC_NAME_MAX_LEN 128 -#define PATH_LEN (FILE_LEN + NAME_MAX) - -#define STRING_FORMAT_SPECIFIER_WITH_MACRO(macro) "%"#macro"s" -#define STR_FS(macro) STRING_FORMAT_SPECIFIER_WITH_MACRO(macro) - -#define KB(bytes) ((bytes)/1024) - -/* permission for open file */ -#define DIR_PERMS (S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) -/* permission for open file */ -#define FILE_PERMS (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH) - -int sig_to_handle[] = { - SIGILL, SIGTRAP, SIGABRT, SIGBUS, - SIGFPE, SIGSTKFLT, SIGXCPU, SIGXFSZ, SIGSYS }; - -#define NUM_SIG_TO_HANDLE \ - ((int)(sizeof(sig_to_handle)/sizeof(sig_to_handle[0]))) - -struct sigaction g_oldact[NUM_SIG_TO_HANDLE]; - -extern void dump_registers(int fd, void *context); -extern int dump_callstack(void **callstack_addrs, int size, void *context, int retry); - -/* get function symbol from elf */ -static int trace_symbols(void *const *array, int size, struct addr_node *start, int fd) -{ - Dl_info info_funcs; - Elf32_Ehdr elf_h = {{0, }, 0, }; - Elf32_Shdr *s_headers; - Elf32_Sym *symtab_entry; - int i, cnt, file, ret; - char *fname; - unsigned long addr, start_addr, offset_addr; - unsigned int strtab_index = 0; - unsigned int symtab_index = 0; - int num_st = 0; - int found_symtab = 0; - int is_mapped = 0; - - for (cnt = 0; cnt < size; cnt++) { - num_st = 0; - /* FIXME : for walking on stack trace */ - if (dladdr(array[cnt], &info_funcs) == 0) { - fprintf(stderr, "[sys-assert]dladdr returnes error!\n"); - /* print just address */ - fprintf_fd(fd, - "%2d: (%p) %s\n", - cnt, array[cnt], dlerror()); - continue; - } - start_addr = (unsigned long)get_start_addr(array[cnt], start); - addr = (unsigned long)array[cnt]; - /* because of launchpad, - * return value of dladdr when find executable is wrong. - * so fix dli_fname here */ - if (info_funcs.dli_fbase && - info_funcs.dli_fname && - info_funcs.dli_fbase == (void *)BASE_LAUNCHPAD_ADDR && - (strncmp("/opt/apps/", info_funcs.dli_fname, - strlen("/opt/apps/")) == 0)) { - info_funcs.dli_fname = get_fpath(array[cnt], start); - offset_addr = addr; - } else { - offset_addr = addr - start_addr; - } - - /* find symbol from elf file */ - if (info_funcs.dli_sname == NULL) { - - /* Both dli_sname and dli_fname is NULL, sys-assert cannot trace any information. - Thus, sys-assert skips to translate such address entry. - However, if a developer wants raw information, we need to fix the code to print raw data */ - if (info_funcs.dli_fname == NULL) - continue; - - file = open(info_funcs.dli_fname, O_RDONLY); - if (file < 0) { - fname = strchr(info_funcs.dli_fname, '/'); - if (!fname) - continue; - file = open(fname, O_RDONLY); - if (file < 0) { - fprintf_fd(fd, - "%2d: (%p) [%s] + %p\n", - cnt, array[cnt], - info_funcs.dli_fname, offset_addr); - continue; - } - } - ret = read(file, &elf_h, sizeof(Elf32_Ehdr)); - if (ret < sizeof(Elf32_Ehdr) || - elf_h.e_shnum <= 0 || - SHN_LORESERVE < elf_h.e_shnum) { - fprintf_fd(fd, "%2d: (%p) [%s] + %p\n", - cnt, array[cnt], info_funcs.dli_fname, offset_addr); - close(file); - continue; - } - if (elf_h.e_type == ET_EXEC) { - info_funcs.dli_fbase = 0; - offset_addr = addr; - } - s_headers = - (Elf32_Shdr *) mmap(0, elf_h.e_shnum * sizeof(Elf32_Shdr), - PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - if (s_headers == NULL) { - fprintf(stderr, "[sys-assert]malloc failed\n"); - fprintf_fd(fd, "%2d: (%p) [%s] + %p\n", - cnt, array[cnt], info_funcs.dli_fname, offset_addr); - close(file); - continue; - } - ret = lseek(file, elf_h.e_shoff, SEEK_SET); - if (ret < 0 || elf_h.e_shentsize > sizeof(Elf32_Shdr) || - elf_h.e_shentsize <= 0) { - close(file); - munmap(s_headers, elf_h.e_shnum * sizeof(Elf32_Shdr)); - return -1; - } - for (i = 0; i < elf_h.e_shnum; i++) { - ret = read(file, &s_headers[i], elf_h.e_shentsize); - if (ret < elf_h.e_shentsize) { - fprintf(stderr, "[sys-assert]read error\n"); - munmap(s_headers, elf_h.e_shnum * sizeof(Elf32_Shdr)); - close(file); - return -1; - } - } - for (i = 0; i < elf_h.e_shnum; i++) { - if (s_headers[i].sh_type == SHT_SYMTAB) { - symtab_index = i; - if (s_headers[i].sh_entsize != 0 && - s_headers[i].sh_size != 0) { - num_st = - s_headers[i].sh_size / s_headers[i].sh_entsize; - found_symtab = 1; - } - break; - } - } - if (!found_symtab) { - fprintf(stderr, - "[sys-assert] can't find symtab\n"); - munmap(s_headers, elf_h.e_shnum * sizeof(Elf32_Shdr)); - close(file); - } else { - /*.strtab index */ - if (symtab_index < elf_h.e_shnum) - strtab_index = s_headers[symtab_index].sh_link; - if (!strtab_index || elf_h.e_shnum <= strtab_index) { - fprintf_fd(fd, "%2d: (%p) [%s] + %p\n", - cnt, array[cnt], info_funcs.dli_fname, offset_addr); - munmap(s_headers, elf_h.e_shnum * sizeof(Elf32_Shdr)); - close(file); - continue; - } - symtab_entry = - (Elf32_Sym *)mmap(0, sizeof(Elf32_Sym) * num_st, - PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - if (symtab_entry == NULL) { - fprintf(stderr, "[sys-assert]malloc failed\n"); - munmap(s_headers, elf_h.e_shnum * sizeof(Elf32_Shdr)); - close(file); - return -1; - } - ret = lseek(file, s_headers[symtab_index].sh_offset, SEEK_SET); - if (ret < 0) { - fprintf_fd(fd, "%2d: (%p) [%s] + %p\n", - cnt, array[cnt], info_funcs.dli_fname, offset_addr); - munmap(symtab_entry, sizeof(Elf32_Sym) * num_st); - munmap(s_headers, elf_h.e_shnum * sizeof(Elf32_Shdr)); - close(file); - continue; - } - for (i = 0; i < num_st; i++) { - ret = read(file, &symtab_entry[i], sizeof(Elf32_Sym)); - if (ret < sizeof(Elf32_Sym)) { - fprintf_fd(fd, - "[sys-assert]symtab_entry[%d], num_st=%d, readnum = %d\n", - i, num_st, ret); - break; - } - if (((info_funcs.dli_fbase + - symtab_entry[i].st_value) - <= array[cnt]) - && (array[cnt] <= - (info_funcs.dli_fbase + - symtab_entry[i].st_value + - symtab_entry[i].st_size))) { - if (symtab_entry[i].st_shndx != STN_UNDEF) { - ret = lseek(file, - s_headers[strtab_index].sh_offset + - symtab_entry[i].st_name, - SEEK_SET); - if (ret < 0) - break; - info_funcs.dli_sname = - (void *)mmap(0, FUNC_NAME_MAX_LEN, - PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - is_mapped = 1; - ret = read(file, (void *)info_funcs.dli_sname, - FUNC_NAME_MAX_LEN); - if (ret < 0) - break; - info_funcs.dli_saddr = - info_funcs.dli_fbase + - symtab_entry[i].st_value; - } - break; - } - } - munmap(s_headers, elf_h.e_shnum * sizeof(Elf32_Shdr)); - munmap(symtab_entry, sizeof(Elf32_Sym) * num_st); - close(file); - } - } - /* print symbol name and address. */ - if (info_funcs.dli_sname != NULL) { - if (array[cnt] >= info_funcs.dli_saddr) - fprintf_fd(fd, "%2d: %s + 0x%x (%p) [%s] + %p\n", - cnt, info_funcs.dli_sname, - (array[cnt] - info_funcs.dli_saddr), - array[cnt], info_funcs.dli_fname, offset_addr); - else - fprintf_fd(fd, "%2d: %s - 0x%x (%p) [%s] + %p\n", - cnt, info_funcs.dli_sname, - (info_funcs.dli_saddr - array[cnt]), - array[cnt], info_funcs.dli_fname, offset_addr); - if (is_mapped) - munmap((void *)info_funcs.dli_sname, FUNC_NAME_MAX_LEN); - } else { - fprintf_fd(fd, "%2d: (%p) [%s] + %p\n", - cnt, array[cnt], info_funcs.dli_fname, offset_addr); - } - } - return 0; -} -/* get address list from maps */ -static struct addr_node *get_addr_list_from_maps(int fd) -{ - int fpath_len, result; - long *saddr; - long *eaddr; - char perm[PERM_LEN]; - char path[PATH_MAX + 1]; - char addr[ADDR_BUF_LEN]; - char linebuf[BUF_SIZE]; - struct addr_node *head = NULL; - struct addr_node *tail = NULL; - struct addr_node *t_node = NULL; - - /* parsing the maps to get executable code address */ - while (fgets_fd(linebuf, BUF_SIZE, fd) != NULL) { - memset(path, 0, PATH_MAX + 1); - result = sscanf(linebuf, STR_FS(ADDR_BUF_LEN_DEC) - STR_FS(PERM_LEN_DEC) - "%*s %*s %*s" - STR_FS(PATH_MAX), addr, perm, path); - if (result < 0) - continue; - perm[PERM_LEN - 1] = 0; - /* rwxp */ -#ifdef ARCH_ARM - if ((perm[2] == 'x' && path[0] == '/') || - (perm[1] == 'w' && path[0] != '/')) { -#else - if (strncmp(perm, "r-xp", strlen("r-xp")) == 0) { -#endif - /* add addr node to list */ - addr[ADDR_LEN] = 0; - saddr = (long *)strtoul(addr, NULL, HEXA); - /* ffff0000-ffff1000 */ - eaddr = (long *)strtoul(&addr[ADDR_LEN + 1], NULL, HEXA); - /* make node and attach to the list */ - t_node = (struct addr_node *)mmap(0, sizeof(struct addr_node), - PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - if (t_node == NULL) { - fprintf(stderr, "error : mmap\n"); - return NULL; - } - memcpy(t_node->perm, perm, PERM_LEN); - t_node->startaddr = saddr; - t_node->endaddr = eaddr; - t_node->fpath = NULL; - fpath_len = strlen(path); - if (fpath_len > 0) { - t_node->fpath = (char *)mmap(0, fpath_len + 1, - PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - memset(t_node->fpath, 0, fpath_len + 1); - memcpy(t_node->fpath, path, fpath_len); - } else { - t_node->fpath = (char *)mmap(0, STR_ANNOY_LEN, - PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - memset(t_node->fpath, 0, STR_ANNOY_LEN); - memcpy(t_node->fpath, STR_ANONY, STR_ANNOY_LEN); - } - t_node->next = NULL; - if (head == NULL) { - head = t_node; - tail = t_node; - } else { - tail->next = t_node; - tail = t_node; - } - } - } - return head; -} - -static void print_node_to_file(struct addr_node *start, int fd) -{ - struct addr_node *t_node; - - t_node = start; - fprintf_fd(fd, "\n%s\n", CRASH_MAPSINFO_TITLE); - while (t_node) { - if (!strncmp(STR_ANONY, t_node->fpath, STR_ANNOY_LEN)) { - t_node = t_node->next; - } else { - fprintf_fd(fd, - "%16lx %16lx %s %s\n", - (unsigned long)t_node->startaddr, - (unsigned long)t_node->endaddr, - t_node->perm, t_node->fpath); - t_node = t_node->next; - } - } - fprintf_fd(fd, "%s\n", CRASH_MAPSINFO_TITLE_E); -} - -static void free_all_nodes(struct addr_node *start) -{ - struct addr_node *t_node, *n_node; - int fpath_len; - - if (start == NULL) - return; - t_node = start; - n_node = t_node->next; - while (t_node) { - if (t_node->fpath != NULL) { - fpath_len = strlen(t_node->fpath); - munmap(t_node->fpath, fpath_len + 1); - } - munmap(t_node, sizeof(struct addr_node)); - if (n_node == NULL) - break; - t_node = n_node; - n_node = n_node->next; - } -} - -static void print_signal_info(int signum, const siginfo_t *info, int fd) -{ - fprintf_fd(fd, "Signal: %d\n", signum); - switch (signum) { - case SIGILL: - fprintf_fd(fd, " (SIGILL)\n"); - break; - case SIGTRAP: - fprintf_fd(fd, " (SIGTRAP)\n"); - break; - case SIGABRT: - fprintf_fd(fd, " (SIGABRT)\n"); - break; - case SIGBUS: - fprintf_fd(fd, " (SIGBUS)\n"); - break; - case SIGFPE: - fprintf_fd(fd, " (SIGFPE)\n"); - break; - case SIGSEGV: - fprintf_fd(fd, " (SIGSEGV)\n"); - break; - case SIGTERM: - fprintf_fd(fd, " (SIGTERM)\n"); - break; - case SIGSTKFLT: - fprintf_fd(fd, " (SIGSTKFLT)\n"); - break; - case SIGXCPU: - fprintf_fd(fd, " (SIGXCPU)\n"); - break; - case SIGXFSZ: - fprintf_fd(fd, " (SIGXFSZ)\n"); - break; - case SIGSYS: - fprintf_fd(fd, " (SIGSYS)\n"); - break; - default: - fprintf_fd(fd, "\n"); - } - /* print signal si_code info */ - fprintf_fd(fd, " si_code: %d\n", info->si_code); - if (info->si_code <= 0 || info->si_code >= 0x80) { - switch (info->si_code) { -#ifdef SI_TKILL - case SI_TKILL: - fprintf_fd(fd, - " signal sent by tkill (sent by pid %d, uid %d)\n", - info->si_pid, info->si_uid); - break; -#endif -#ifdef SI_USER - case SI_USER: - fprintf_fd(fd, - " signal sent by kill (sent by pid %d, uid %d)\n", - info->si_pid, info->si_uid); - break; -#endif -#ifdef SI_KERNEL - case SI_KERNEL: - fprintf_fd(fd, " signal sent by the kernel\n"); - break; -#endif - } - } else if (signum == SIGILL) { - switch (info->si_code) { - case ILL_ILLOPC: - fprintf_fd(fd, " illegal opcode\n"); - break; - case ILL_ILLOPN: - fprintf_fd(fd, " illegal operand\n"); - break; - case ILL_ILLADR: - fprintf_fd(fd, " illegal addressing mode\n"); - break; - case ILL_ILLTRP: - fprintf_fd(fd, " illegal trap\n"); - break; - case ILL_PRVOPC: - fprintf_fd(fd, " privileged opcode\n"); - break; - case ILL_PRVREG: - fprintf_fd(fd, " privileged register\n"); - break; - case ILL_COPROC: - fprintf_fd(fd, " coprocessor error\n"); - break; - case ILL_BADSTK: - fprintf_fd(fd, " internal stack error\n"); - break; - default: - fprintf_fd(fd, " illegal si_code = %d\n", info->si_code); - break; - } - fprintf_fd(fd, " si_addr: %p\n", info->si_addr); - } else if (signum == SIGFPE) { - switch (info->si_code) { - case FPE_INTDIV: - fprintf_fd(fd, " integer divide by zero\n"); - break; - case FPE_INTOVF: - fprintf_fd(fd, " integer overflow\n"); - break; - case FPE_FLTDIV: - fprintf_fd(fd, " floating-point divide by zero\n"); - break; - case FPE_FLTOVF: - fprintf_fd(fd, " floating-point overflow\n"); - break; - case FPE_FLTUND: - fprintf_fd(fd, " floating-point underflow\n"); - break; - case FPE_FLTRES: - fprintf_fd(fd, " floating-point inexact result\n"); - break; - case FPE_FLTINV: - fprintf_fd(fd, " invalid floating-point operation\n"); - break; - case FPE_FLTSUB: - fprintf_fd(fd, " subscript out of range\n"); - break; - default: - fprintf_fd(fd, " illegal si_code: %d\n", info->si_code); - break; - } - } else if (signum == SIGSEGV) { - switch (info->si_code) { - case SEGV_MAPERR: - fprintf_fd(fd, " address not mapped to object\n"); - break; - case SEGV_ACCERR: - fprintf_fd(fd, - " invalid permissions for mapped object\n"); - break; - default: - fprintf_fd(fd, " illegal si_code: %d\n", info->si_code); - break; - } - fprintf_fd(fd, " si_addr = %p\n", info->si_addr); - } else if (signum == SIGBUS) { - switch (info->si_code) { - case BUS_ADRALN: - fprintf_fd(fd, " invalid address alignment\n"); - break; - case BUS_ADRERR: - fprintf_fd(fd, " nonexistent physical address\n"); - break; - case BUS_OBJERR: - fprintf_fd(fd, " object-specific hardware error\n"); - break; - default: - fprintf_fd(fd, " illegal si_code: %d\n", info->si_code); - break; - } - fprintf_fd(fd, " si_addr: %p\n", info->si_addr); - } -} - -void sighandler(int signum, siginfo_t *info, void *context) -{ - int idx; - int readnum; - int threadnum; - /* file descriptor */ - int fd; - int fd_cs; /* for cs file */ - pid_t pid; - pid_t tid; - DIR *dir; - struct dirent *dentry = NULL; - char timestr[TIME_MAX_LEN]; - char processname[NAME_MAX] = {0,}; - char exepath[PATH_LEN] = {0,}; - char filepath[PATH_LEN]; - char crashid[TIME_MAX_LEN] = {0,}; - /* for get time */ - time_t cur_time; - /* for get info */ - char infoname[INFO_LEN]; - char value[VALUE_LEN]; - char linebuf[BUF_SIZE]; - char *p_exepath = NULL; - void *callstack_addrs[CALLSTACK_SIZE]; - int cnt_callstack = 0; - /* for backtrace_symbols() */ - struct addr_node *head = NULL; - /* for preventing recursion */ - static int retry_count = 0; - struct sysinfo si = {0,}; - - if (retry_count > 1) { - fprintf(stderr, "[sys-assert] recurcive called\n"); - return; - } - - cur_time = time(NULL); - /* get pid */ - pid = getpid(); - tid = (long int)syscall(__NR_gettid); - /* open maps file */ - if ((fd = open(MAPS_PATH, O_RDONLY)) < 0) { - fprintf(stderr, "[sys-assert]can't open %s\n", MAPS_PATH); - } else { - /* parsing the maps to get code segment address*/ - head = get_addr_list_from_maps(fd); - close(fd); - } - if (retry_count) - fprintf(stderr, "retry backtrace in sighandler"); - cnt_callstack = dump_callstack(callstack_addrs, CALLSTACK_SIZE, context, retry_count); - retry_count += 1; - /* get exepath */ - if ((readnum = open_read(CMDLINE_PATH, exepath, sizeof(exepath) - 1)) <= 0) { - fprintf(stderr, "[sys-assert]can't read %s\n", CMDLINE_PATH); - readnum = snprintf(exepath, sizeof(exepath), "unknown_process"); - } - exepath[readnum] = '\0'; - /* get processname */ - if ((p_exepath = remove_path(exepath)) == NULL) - return; - snprintf(processname, NAME_MAX, "%s", p_exepath); - /* added temporary skip when crash-worker is asserted */ - if (!strcmp(processname, "crash-worker") || - !strcmp(processname, "crash-popup")) - return; - /* make crash info file name */ - snprintf(timestr, sizeof(timestr), "%.10ld", cur_time); - snprintf(crashid, sizeof(crashid), "%s_%d", processname, pid); - if (snprintf(filepath, PATH_LEN, - "%s/%s.info", CRASH_INFO_PATH, crashid) == 0) { - fprintf(stderr, - "[sys-assert]can't make crash info file name : %s\n", - crashid); - return; - } - /* check crash info dump directory, make directory if absent */ - if (access(CRASH_INFO_PATH, F_OK) == -1) { - fprintf(stderr, "[sys-assert] No directory (%s)", CRASH_INFO_PATH); - /*TODO: making directory */ - return; - } - /* logging crash information to stderr */ - fprintf(stderr, "crashed [%s] processname=%s, pid=%d, tid=%d, signal=%d", - timestr, processname, pid, tid, signum); - /* complete filepath_cs */ - if (!strlen(filepath)) - return; - /* create cs file */ - if ((fd_cs = creat(filepath, FILE_PERMS)) < 0) { - fprintf(stderr, - "[sys-assert]can't create %s. errno = %d\n", - filepath, errno); - return; - } - - /* print exepath info */ - fprintf_fd(fd_cs, "Executable File Path: %s\n", exepath); - - /* print signal info */ - print_signal_info(signum, info, fd_cs); - fsync(fd_cs); - /* print register info */ - dump_registers(fd_cs, context); - - /* print meminfo */ - fprintf_fd(fd_cs, "\n%s\n", CRASH_MEMINFO_TITLE); - if (!sysinfo(&si)) { - fprintf_fd(fd_cs, "MemTotal: %8ld KB\n", KB(si.totalram)); - fprintf_fd(fd_cs, "MemFree: %8ld KB\n", KB(si.freeram)); - fprintf_fd(fd_cs, "Buffers: %8ld KB\n", KB(si.bufferram)); - } else - fprintf(stderr, "[sys-assert]can't get sysinfo\n"); - - if ((fd = open(MEMINFO_PATH, O_RDONLY)) < 0) { - fprintf(stderr, "[sys-assert]can't open %s\n", MEMINFO_PATH); - } else { - while (fgets_fd(linebuf, BUF_SIZE, fd) != NULL) { - sscanf(linebuf, STR_FS(INFO_LEN_DEC) - STR_FS(VALUE_LEN_DEC) - "%*s", infoname, value); - if (strcmp("Cached:", infoname) == 0) { - fprintf_fd(fd_cs, "%s %8s KB\n", infoname, value); - break; - } - } - close(fd); - } - - threadnum = 0; - if ((fd = open(STATUS_PATH, O_RDONLY)) < 0) { - fprintf(stderr, "[sys-assert]can't open %s\n", STATUS_PATH); - } else { - while (fgets_fd(linebuf, BUF_SIZE, fd) != NULL) { - sscanf(linebuf, STR_FS(INFO_LEN_DEC) - STR_FS(VALUE_LEN_DEC) - "%*s", infoname, value); - if (strcmp("VmPeak:", infoname) == 0) { - fprintf_fd(fd_cs, "%s %8s KB\n", infoname, - value); - } else if (strcmp("VmSize:", infoname) == 0) { - fprintf_fd(fd_cs, "%s %8s KB\n", infoname, - value); - } else if (strcmp("VmLck:", infoname) == 0) { - fprintf_fd(fd_cs, "%s %8s KB\n", infoname, - value); - } else if (strcmp("VmPin:", infoname) == 0) { - fprintf_fd(fd_cs, "%s %8s KB\n", infoname, - value); - } else if (strcmp("VmHWM:", infoname) == 0) { - fprintf_fd(fd_cs, "%s %8s KB\n", - infoname, value); - } else if (strcmp("VmRSS:", infoname) == 0) { - fprintf_fd(fd_cs, "%s %8s KB\n", - infoname, value); - } else if (strcmp("VmData:", infoname) == 0) { - fprintf_fd(fd_cs, "%s %8s KB\n", - infoname, value); - } else if (strcmp("VmStk:", infoname) == 0) { - fprintf_fd(fd_cs, "%s %8s KB\n", - infoname, value); - } else if (strcmp("VmExe:", infoname) == 0) { - fprintf_fd(fd_cs, "%s %8s KB\n", - infoname, value); - } else if (strcmp("VmLib:", infoname) == 0) { - fprintf_fd(fd_cs, "%s %8s KB\n", - infoname, value); - } else if (strcmp("VmPTE:", infoname) == 0) { - fprintf_fd(fd_cs, "%s %8s KB\n", - infoname, value); - } else if (strcmp("VmSwap:", infoname) == 0) { - fprintf_fd(fd_cs, "%s %8s KB\n", - infoname, value); - } else if (strcmp("Threads:", infoname) == 0) { - threadnum = atoi(value); - break; - } - } - close(fd); - } - /* print thread info */ - if (1 < threadnum) { - fprintf_fd(fd_cs, "\n%s\n", CRASH_THREADINFO_TITLE); - fprintf_fd(fd_cs, - "Threads: %d\nPID = %d TID = %d\n", - threadnum, pid, tid); - /* print thread */ - dir = opendir(TASK_PATH); - if (!dir) { - fprintf(stderr, "[sys-assert]can't open %s\n", TASK_PATH); - } else { - while ((dentry = readdir(dir))) { - if (strcmp(dentry->d_name, ".") == 0 - || strcmp(dentry->d_name, "..") == 0) - continue; - fprintf_fd(fd_cs, "%s ", dentry->d_name); - } - closedir(dir); - fprintf_fd(fd_cs, "\n"); - } - } - if (head != NULL) { - /* print maps information */ - print_node_to_file(head, fd_cs); - /* print callstack */ - fprintf_fd(fd_cs, "\n%s (PID:%d)\n", CRASH_CALLSTACKINFO_TITLE, pid); - fprintf_fd(fd_cs, "Call Stack Count: %d\n", cnt_callstack); - if (trace_symbols(&callstack_addrs[CALLSTACK_BASE], - cnt_callstack, head, fd_cs) < 0) - fprintf(stderr, "[sys-assert] trace_symbols failed\n"); - fprintf_fd(fd_cs, "%s\n", CRASH_CALLSTACKINFO_TITLE_E); - free_all_nodes(head); - } - /* cs file sync */ - fsync(fd_cs); - /* clean up */ - if (close(fd_cs) == -1) - fprintf(stderr, "[sys-assert] fd_cs close error!!\n"); - /* core dump set */ - if (prctl(PR_GET_DUMPABLE) == 0) - prctl(PR_SET_DUMPABLE, 1); - - for (idx = 0; idx < NUM_SIG_TO_HANDLE; idx++) { - if (sig_to_handle[idx] == signum) { - sigaction(signum, &g_oldact[idx], NULL); - break; - } - } - raise(signum); -} - -__attribute__ ((constructor)) -void init() -{ - int idx; - - for (idx = 0; idx < NUM_SIG_TO_HANDLE; idx++) { - struct sigaction act; - act.sa_sigaction = (void *)sighandler; - sigemptyset(&act.sa_mask); - act.sa_flags = SA_SIGINFO; - act.sa_flags |= SA_RESETHAND; - if (sigaction(sig_to_handle[idx], &act, &g_oldact[idx]) < 0) { - perror("[sys-assert]could not set signal handler "); - continue; - } - } -} diff --git a/src/sys-assert/sys-assert.conf.in b/src/sys-assert/sys-assert.conf.in deleted file mode 100644 index 29dff1d..0000000 --- a/src/sys-assert/sys-assert.conf.in +++ /dev/null @@ -1,2 +0,0 @@ -d /tmp/crash_stack 1777 root root -t /tmp/crash_stack - - - - security.SMACK64=* diff --git a/src/sys-assert/sys-assert.h b/src/sys-assert/sys-assert.h deleted file mode 100755 index f24feac..0000000 --- a/src/sys-assert/sys-assert.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * SYS-ASSERT - * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -#ifndef _DEBUG_ASSERT_H_ -#define _DEBUG_ASSERT_H_ - -#include - -#ifdef ARCH_ARM -#define BASE_LAUNCHPAD_ADDR 0x8000 -#else -#define BASE_LAUNCHPAD_ADDR 0x8048000 -#endif -#define CALLSTACK_BASE 3 - -#ifdef __cplusplus -extern "C" { -#endif - - struct addr_node { - long *startaddr; - long *endaddr; - char perm[5]; - char *fpath; - struct addr_node *next; - }; - -#ifdef ARCH_ARM - typedef struct layout { - struct layout *fp; - void *ret; - } layout; - -#else - typedef struct layout { - struct layout *ebp; - void *ret; - } layout; -#endif - - extern void *__libc_stack_end; - -#ifdef __cplusplus -} -#endif -#endif /* _DEBUG_ASSERT_H_ */ diff --git a/src/sys-assert/util.c b/src/sys-assert/util.c deleted file mode 100644 index 3fc2e66..0000000 --- a/src/sys-assert/util.c +++ /dev/null @@ -1,118 +0,0 @@ -/* - * SYS-ASSERT - * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include -#include -#include -#include "util.h" - -int open_read(const char *path, char *buf, int size) -{ - int fd; - int ret; - - if (buf == NULL || path == NULL) - return -1; - - fd = open(path, O_RDONLY); - if (fd < 0) - return -1; - - ret = read(fd, buf, size - 1); - if (ret <= 0) { - close(fd); - return -1; - } else - buf[ret] = '\0'; - - close(fd); - - return ret; -} - -char *fgets_fd(char *str, int len, int fd) -{ - char ch; - register char *cs; - int num = 0; - - cs = str; - while (--len > 0 && (num = read(fd, &ch, 1) > 0)) { - if ((*cs++ = ch) == '\n') - break; - } - *cs = '\0'; - return (num == 0 && cs == str) ? NULL : str; -} - -char *remove_path(const char *cmd) -{ - char *cp; - char *np; - - cp = np = (char *)cmd; - while (*cp && *cp != ' ') { - if (*cp == '/') - np = cp + 1; - cp++; - } - return np; -} - -char *get_fpath(long *value, struct addr_node *start) -{ - struct addr_node *t_node; - struct addr_node *n_node; - - if (value == 0 || start == NULL) - return NULL; - t_node = start; - n_node = t_node->next; - while (n_node) { - if (t_node->endaddr <= value) { - t_node = n_node; - n_node = n_node->next; - } else if (t_node->startaddr <= value) { - return t_node->fpath; - } else - break; - } - return NULL; -} - -long *get_start_addr(long *value, struct addr_node *start) -{ - struct addr_node *t_node; - struct addr_node *n_node; - - if (value == 0 || start == NULL) - return NULL; - t_node = start; - n_node = t_node->next; - while (n_node) { - if (t_node->endaddr <= value) { - t_node = n_node; - n_node = n_node->next; - } else if (t_node->startaddr <= value) { - return t_node->startaddr; - } else - break; - } - return NULL; -} diff --git a/src/sys-assert/util.h b/src/sys-assert/util.h deleted file mode 100644 index ff7f7f3..0000000 --- a/src/sys-assert/util.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * SYS-ASSERT - * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "sys-assert.h" - -int open_read(const char *path, char *buf, int size); - -char *fgets_fd(char *str, int len, int fd); - -#define fprintf_fd(fd, fmt, ...) dprintf(fd, fmt, ##__VA_ARGS__) - -char *remove_path(const char *cmd); - -char *get_fpath(long *value, struct addr_node *start); - -long *get_start_addr(long *value, struct addr_node *start); diff --git a/src/sys-assert/x86/backtrace.c b/src/sys-assert/x86/backtrace.c deleted file mode 100644 index 4c07d86..0000000 --- a/src/sys-assert/x86/backtrace.c +++ /dev/null @@ -1,56 +0,0 @@ -/* - * SYS-ASSERT - * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include -#include -#include "sys-assert.h" -#include "util.h" -#include "sys-assert-regs.h" - -int dump_callstack(void **callstack_addrs, int size, void *context, int retry) -{ - ucontext_t *ucontext = context; - int count = CALLSTACK_BASE; - - if (!callstack_addrs) - return 0; - - if (context) { - layout *ebp = (layout *)ucontext->uc_mcontext.gregs[REG_EBP]; - callstack_addrs[count++] = - (long *)ucontext->uc_mcontext.gregs[REG_EIP]; - while (ebp && (count < size)) { - callstack_addrs[count++] = ebp->ret; - ebp = ebp->ebp; - } - } else { - count = backtrace(callstack_addrs, size); - } - - if (count > CALLSTACK_BASE) { - count -= CALLSTACK_BASE; - } else if (context) { - callstack_addrs[CALLSTACK_BASE] = (long *)ucontext->uc_mcontext.gregs[REG_EIP]; - callstack_addrs[CALLSTACK_BASE + 1] = (long *)ucontext->uc_mcontext.gregs[REG_ESP]; - count = 2; - } else { - count = 0; - } - return count; -}; diff --git a/src/sys-assert/x86/context.c b/src/sys-assert/x86/context.c deleted file mode 100644 index 313ad86..0000000 --- a/src/sys-assert/x86/context.c +++ /dev/null @@ -1,56 +0,0 @@ -/* - * SYS-ASSERT - * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include -#include "sys-assert.h" -#include "util.h" -#include "sys-assert-regs.h" - -#define CRASH_REGISTERINFO_TITLE "Register Information" - -void dump_registers(int fd, void *context) -{ - ucontext_t *ucontext = context; - /* for context info */ - if (!context) - return; - - fprintf_fd(fd, "\n%s\n", CRASH_REGISTERINFO_TITLE); - fprintf_fd(fd, - "gs = 0x%08x, fs = 0x%08x\nes = 0x%08x, ds = 0x%08x\n", - ucontext->uc_mcontext.gregs[REG_GS], - ucontext->uc_mcontext.gregs[REG_FS], - ucontext->uc_mcontext.gregs[REG_ES], - ucontext->uc_mcontext.gregs[REG_DS]); - fprintf_fd(fd, - "edi = 0x%08x, esi = 0x%08x\nebp = 0x%08x, esp = 0x%08x\n", - ucontext->uc_mcontext.gregs[REG_EDI], - ucontext->uc_mcontext.gregs[REG_ESI], - ucontext->uc_mcontext.gregs[REG_EBP], - ucontext->uc_mcontext.gregs[REG_ESP]); - fprintf_fd(fd, - "eax = 0x%08x, ebx = 0x%08x\necx = 0x%08x, edx = 0x%08x\n", - ucontext->uc_mcontext.gregs[REG_EAX], - ucontext->uc_mcontext.gregs[REG_EBX], - ucontext->uc_mcontext.gregs[REG_ECX], - ucontext->uc_mcontext.gregs[REG_EDX]); - fprintf_fd(fd, - "eip = 0x%08x\n", - ucontext->uc_mcontext.gregs[REG_EIP]); -}; diff --git a/src/sys-assert/x86/sys-assert-regs.h b/src/sys-assert/x86/sys-assert-regs.h deleted file mode 100644 index f68baec..0000000 --- a/src/sys-assert/x86/sys-assert-regs.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - * SYS-ASSERT - * Copyright (c) 2016 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __SYS_ASSERT_REGS_H__ -#define __SYS_ASSERT_REGS_H__ - -#include - -#ifndef REG_GS -#define REG_GS 0 -#endif - -#ifndef REG_FS -#define REG_FS 1 -#endif - -#ifndef REG_ES -#define REG_ES 2 -#endif - -#ifndef REG_DS -#define REG_DS 3 -#endif - -#ifndef REG_EDI -#define REG_EDI 4 -#endif - -#ifndef REG_ESI -#define REG_ESI 5 -#endif - -#ifndef REG_EBP -#define REG_EBP 6 -#endif - -#ifndef REG_ESP -#define REG_ESP 7 -#endif - -#ifndef REG_EBX -#define REG_EBX 8 -#endif - -#ifndef REG_EDX -#define REG_EDX 9 -#endif - -#ifndef REG_ECX -#define REG_ECX 10 -#endif - -#ifndef REG_EAX -#define REG_EAX 11 -#endif - -#ifndef REG_TRAPNO -#define REG_TRAPNO 12 -#endif - -#ifndef REG_ERR -#define REG_ERR 13 -#endif - -#ifndef REG_EIP -#define REG_EIP 14 -#endif - -#ifndef REG_CS -#define REG_CS 15 -#endif - -#ifndef REG_EFL -#define REG_EFL 16 -#endif - -#ifndef REG_UESP -#define REG_UESP 17 -#endif - -#ifndef REG_SS -#define REG_SS 18 -#endif - -#endif /* __SYS_ASSERT_REGS_H__ */ -- 2.7.4