From 64f5b8a73e16fbaa1b00c99dcb0dec07919fe2ef Mon Sep 17 00:00:00 2001 From: Mateusz Moscicki Date: Tue, 10 Sep 2019 14:22:49 +0200 Subject: [PATCH 01/16] Move log_dump to platform/core/system/log_dump Change-Id: I7349a275c370cef32cb6da143acb1b5255de68f3 --- include/defs.h.in | 1 - packaging/crash-worker_system-tests.spec | 3 - packaging/log_dump.manifest | 8 - packaging/log_dump.spec | 62 ---- src/log_dump/CMakeLists.txt | 53 ---- src/log_dump/dbus-handler.c | 238 ---------------- src/log_dump/dbus-handler.h | 26 -- src/log_dump/log_dump.c | 315 --------------------- src/log_dump/log_dump.conf | 26 -- src/log_dump/log_dump.h | 36 --- src/log_dump/log_dump.service.m4 | 11 - src/log_dump/org.tizen.system.crash.service | 4 - tests/system/CMakeLists.txt | 3 - .../log_dump_crash_root_path.sh.template | 31 -- .../log_dump_normal/log_dump_normal.sh.template | 28 -- .../log_dump_short/log_dump_short.sh.template | 32 --- 16 files changed, 877 deletions(-) delete mode 100644 packaging/log_dump.manifest delete mode 100644 packaging/log_dump.spec delete mode 100644 src/log_dump/CMakeLists.txt delete mode 100644 src/log_dump/dbus-handler.c delete mode 100644 src/log_dump/dbus-handler.h delete mode 100644 src/log_dump/log_dump.c delete mode 100644 src/log_dump/log_dump.conf delete mode 100644 src/log_dump/log_dump.h delete mode 100644 src/log_dump/log_dump.service.m4 delete mode 100644 src/log_dump/org.tizen.system.crash.service delete mode 100644 tests/system/log_dump_crash_root_path/log_dump_crash_root_path.sh.template delete mode 100644 tests/system/log_dump_normal/log_dump_normal.sh.template delete mode 100644 tests/system/log_dump_short/log_dump_short.sh.template diff --git a/include/defs.h.in b/include/defs.h.in index a333ff7..3ac9871 100644 --- a/include/defs.h.in +++ b/include/defs.h.in @@ -10,7 +10,6 @@ #define CRASH_STACK_BIN_PATH "@CRASH_STACK_BIN_PATH@" #define CRASH_POPUP_BIN_PATH "@CRASH_POPUP_BIN_PATH@" #define CRASH_NOTIFY_BIN_PATH "@CRASH_NOTIFY_BIN_PATH@" -#define LOG_DUMP_BIN_PATH "@LOG_DUMP_BIN_PATH@" #define DUMP_SYSTEMSTATE_BIN_PATH "@DUMP_SYSTEMSTATE_BIN_PATH@" #define DUMP_SYSTEMSTATE_CONFIG_DIR_PATH "@DUMP_SYSTEMSTATE_CONFIG_DIR_PATH@" #define CRASH_MANAGER_CONFIG_PATH "@CRASH_MANAGER_CONFIG_PATH@" diff --git a/packaging/crash-worker_system-tests.spec b/packaging/crash-worker_system-tests.spec index 2ae412e..2139828 100644 --- a/packaging/crash-worker_system-tests.spec +++ b/packaging/crash-worker_system-tests.spec @@ -66,9 +66,6 @@ cd tests/system %{_libdir}/crash-worker_system-tests/dump_systemstate_extras/dump_systemstate_extras.sh %{_libdir}/crash-worker_system-tests/extra_script/extra_script.sh %{_libdir}/crash-worker_system-tests/info_file/info_file.sh -%{_libdir}/crash-worker_system-tests/log_dump_crash_root_path/log_dump_crash_root_path.sh -%{_libdir}/crash-worker_system-tests/log_dump_normal/log_dump_normal.sh -%{_libdir}/crash-worker_system-tests/log_dump_short/log_dump_short.sh %{_libdir}/crash-worker_system-tests/log_file/log_file.sh %{_libdir}/crash-worker_system-tests/report_basic/report_basic.sh %{_libdir}/crash-worker_system-tests/report_type_info/report_type_info.sh diff --git a/packaging/log_dump.manifest b/packaging/log_dump.manifest deleted file mode 100644 index a340d2e..0000000 --- a/packaging/log_dump.manifest +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/packaging/log_dump.spec b/packaging/log_dump.spec deleted file mode 100644 index ce97c0b..0000000 --- a/packaging/log_dump.spec +++ /dev/null @@ -1,62 +0,0 @@ -Name: log_dump -Summary: log_dump -Version: 5.5.19 -Release: 1 -Group: Framework/system -License: Apache-2.0 and BSD -Source0: %{name}-%{version}.tar.gz -Source1001: log_dump.manifest -Requires: crash-worker -BuildRequires: pkgconfig(dlog) -BuildRequires: pkgconfig(libtzplatform-config) -BuildRequires: pkgconfig(iniparser) -BuildRequires: pkgconfig(capi-system-info) -BuildRequires: pkgconfig(glib-2.0) -BuildRequires: cmake -BuildRequires: pkgconfig(pkgmgr-info) - -%description -log_dump - -%prep -%setup -q - -%define crash_root_path %{TZ_SYS_CRASH_ROOT} -%define crash_all_log %{TZ_SYS_ALLLOGS} -%define crash_dump_gen %{TZ_SYS_DUMPGEN} - -%build -cp %{SOURCE1001} . - -%cmake src/log_dump/ \ - -DCRASH_ROOT_PATH=%{crash_root_path} \ - -DDUMP_SYSTEMSTATE_BIN_PATH=%{_bindir}/dump_systemstate \ - -DCRASH_MANAGER_CONFIG_PATH=%{_sysconfdir}/crash-manager.conf - -make %{?jobs:-j%jobs} - -%install -rm -rf %{buildroot} -%make_install -mkdir -p %{buildroot}%{crash_all_log} -mkdir -p %{buildroot}%{crash_dump_gen} -cp dump_scripts/* %{buildroot}%{crash_dump_gen} -chmod 755 %{buildroot}%{crash_dump_gen}/* - -%post -/usr/bin/chsmack -a "System" -t %{crash_dump_gen} -/usr/bin/chsmack -a "System" -t %{crash_dump_gen}/module.d -/usr/bin/chsmack -a "System::Shared" -t %{crash_all_log} -/usr/bin/chsmack -a "_" %{crash_dump_gen}/module.d/* - -%files -%license LICENSE -%manifest log_dump.manifest -%dir %{crash_all_log} -%{crash_dump_gen}/* -%attr(-,root,root) %{_unitdir}/log_dump.service -%attr(-,root,root) %{_sysconfdir}/dbus-1/system.d/log_dump.conf -%attr(-,root,root) %{_datadir}/dbus-1/system-services/org.tizen.system.crash.service -%attr(0750,system_fw,system_fw) %{_bindir}/log_dump - - diff --git a/src/log_dump/CMakeLists.txt b/src/log_dump/CMakeLists.txt deleted file mode 100644 index cc91ea5..0000000 --- a/src/log_dump/CMakeLists.txt +++ /dev/null @@ -1,53 +0,0 @@ -CMAKE_MINIMUM_REQUIRED(VERSION 2.6) -PROJECT(log_dump C) - -ADD_SUBDIRECTORY(${CMAKE_SOURCE_DIR}/../../include ${CMAKE_SOURCE_DIR}/../../include) -ADD_DEFINITIONS(-D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE=1) - -INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/../../include/) -INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/../) - -SET(LOG_DUMP_SRCS - log_dump.c - dbus-handler.c - ${CMAKE_SOURCE_DIR}/../shared/util.c - ${CMAKE_SOURCE_DIR}/../shared/spawn.c - ${CMAKE_SOURCE_DIR}/../shared/config.c - ) - -INCLUDE(FindPkgConfig) -pkg_check_modules(log_dump_pkgs REQUIRED - dlog - capi-system-info - libtzplatform-config - iniparser - gio-2.0 - ) - -INCLUDE(${CMAKE_SOURCE_DIR}/../../cmake/ProcessM4.cmake) - -FOREACH(flag ${log_dump_pkgs_CFLAGS}) - SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") -ENDFOREACH(flag) - -SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fPIE") - -ADD_EXECUTABLE(${PROJECT_NAME} ${LOG_DUMP_SRCS}) -TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${log_dump_pkgs_LDFLAGS} -pie) - -PROCESS_M4("${M4_DEFINES}" - "${CMAKE_CURRENT_SOURCE_DIR}/log_dump.service.m4" - "${CMAKE_CURRENT_SOURCE_DIR}/log_dump.service") - -INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/org.tizen.system.crash.service - DESTINATION /usr/share/dbus-1/system-services) - -INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/log_dump.conf - DESTINATION /etc/dbus-1/system.d) - -INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/log_dump.service DESTINATION /usr/lib/systemd/system - PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ) - -INSTALL(TARGETS ${PROJECT_NAME} DESTINATION bin - PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE - GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) diff --git a/src/log_dump/dbus-handler.c b/src/log_dump/dbus-handler.c deleted file mode 100644 index 2eecde6..0000000 --- a/src/log_dump/dbus-handler.c +++ /dev/null @@ -1,238 +0,0 @@ -/* - * log_dump - * - * 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. - */ - -#include -#include -#include "log_dump.h" -#include "dbus-handler.h" - -/* Dbus activation */ -#define CRASH_BUS_NAME "org.tizen.system.crash" -#define CRASH_OBJECT_PATH "/Org/Tizen/System/Crash/Crash" - -/* Log dump signal */ -#define LOG_DUMP_BUS_NAME "org.tizen.system.logdump" -#define LOG_DUMP_OBJECT_PATH "/Org/Tizen/System/LogDump" -#define LOG_DUMP_INTERFACE_NAME LOG_DUMP_BUS_NAME -#define LOG_DUMP_START_SIGNAL "Start" -#define LOG_DUMP_FINISH_SIGNAL "Finish" - -#define TIMEOUT_INTERVAL 30 - -static GMainLoop *loop; -static GMutex timeout_mutex; -static guint timeout_id; -static GDBusNodeInfo *introspection_data; -static const gchar introspection_xml[] = -"" -" " -" " -" " -" " -" " -" " -" " -" " -" " -""; - -static int timeout_cb(gpointer data) -{ - _I("Time out!"); - g_main_loop_quit((GMainLoop *)data); - - return 0; -} - -static void add_timeout(void) -{ - g_mutex_lock(&timeout_mutex); - - if (timeout_id) - g_source_remove(timeout_id); - timeout_id = g_timeout_add_seconds(TIMEOUT_INTERVAL, timeout_cb, loop); - - g_mutex_unlock(&timeout_mutex); - _I("Add loop timeout (%d)", TIMEOUT_INTERVAL); -} - -static void remove_timeout(void) -{ - g_mutex_lock(&timeout_mutex); - - if (timeout_id) { - g_source_remove(timeout_id); - timeout_id = 0; - } - - g_mutex_unlock(&timeout_mutex); - _I("Remove loop timeout"); -} - -static void method_call_handler(GDBusConnection *conn, - const gchar *sender, - const gchar *object_path, - const gchar *iface_name, - const gchar *method_name, - GVariant *parameters, - GDBusMethodInvocation *invocation, - gpointer user_data) -{ - int ret = -1; - const gchar *arg; - - remove_timeout(); - - if (g_strcmp0(method_name, "dump_log") == 0) { - g_variant_get(parameters, "(&s)", &arg); - if (g_strcmp0(arg, "normal") == 0) - ret = log_dump(OPT_NORMAL); - else if (g_strcmp0(arg, "short") == 0) - ret = log_dump(OPT_SHORT); - else - _E("Wrong option for log_dump"); - } else if (g_strcmp0(method_name, "delete_dump") == 0) { - ret = delete_dump(); - } - - g_dbus_method_invocation_return_value(invocation, - g_variant_new("(i)", ret)); - - add_timeout(); -} - -static const GDBusInterfaceVTable interface_vtable = { - method_call_handler, - NULL, - NULL -}; - -static void on_bus_acquired(GDBusConnection *conn, - const gchar *name, - gpointer user_data) -{ - guint registration_id; - - registration_id = g_dbus_connection_register_object(conn, - CRASH_OBJECT_PATH, introspection_data->interfaces[0], - &interface_vtable, NULL, NULL, NULL); - if (registration_id == 0) - _E("Failed to g_dbus_connection_register_object"); -} - -static void on_name_acquired(GDBusConnection *conn, - const gchar *name, - gpointer user_data) -{ - _D("Acquired the name %s on the system bus", name); -} - -static void on_name_lost(GDBusConnection *conn, - const gchar *name, - gpointer user_data) -{ - _D("Lost the name %s on the system bus", name); -} - -static void dbus_init(void) -{ - GDBusConnection *conn = NULL; - GError *error = NULL; - - introspection_data = - g_dbus_node_info_new_for_xml(introspection_xml, NULL); - if (introspection_data == NULL) { - _E("Failed to init g_dbus_info_new_for_xml"); - return; - } - - conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error); - if (!conn) { - _E("Failed to get dbus"); - return; - } - - if (error) { - _E("Failed to get dbus: %s", error->message); - g_error_free(error); - return; - } - - g_bus_own_name(G_BUS_TYPE_SYSTEM, CRASH_BUS_NAME, - G_BUS_NAME_OWNER_FLAGS_NONE, on_bus_acquired, - on_name_acquired, on_name_lost, NULL, NULL); -} - -int log_dump_dbus(void) -{ - loop = g_main_loop_new(NULL, false); - - dbus_init(); - - g_mutex_init(&timeout_mutex); - add_timeout(); - - _I("log_dump_dbus activated"); - g_main_loop_run(loop); - - if (introspection_data) - g_dbus_node_info_unref(introspection_data); - g_mutex_clear(&timeout_mutex); - g_main_loop_unref(loop); - - return 0; -} - -static int broadcast_logdump(const char *signal) -{ - GDBusConnection *conn; - GError *error = NULL; - - _I("broadcast signal: %s", signal); - conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error); - if (error) { - _E("Failed to get dbus: %s", error->message); - g_error_free(error); - return -1; - } - - g_dbus_connection_emit_signal(conn, - NULL, - LOG_DUMP_OBJECT_PATH, - LOG_DUMP_INTERFACE_NAME, - signal, - NULL, - &error); - if (error) { - _E("Failed to emit signal: %s", error->message); - g_error_free(error); - return -1; - } - - return 0; -} - -int broadcast_logdump_start(void) -{ - return broadcast_logdump(LOG_DUMP_START_SIGNAL); -} - -int broadcast_logdump_finish(void) -{ - return broadcast_logdump(LOG_DUMP_FINISH_SIGNAL); -} diff --git a/src/log_dump/dbus-handler.h b/src/log_dump/dbus-handler.h deleted file mode 100644 index a936f31..0000000 --- a/src/log_dump/dbus-handler.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * log_dump - * - * 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 __LOGDUMP_DBUS_H__ -#define __LOGDUMP_DBUS_H__ - -int log_dump_dbus(void); -int broadcast_logdump_start(void); -int broadcast_logdump_finish(void); - -#endif diff --git a/src/log_dump/log_dump.c b/src/log_dump/log_dump.c deleted file mode 100644 index 994ed59..0000000 --- a/src/log_dump/log_dump.c +++ /dev/null @@ -1,315 +0,0 @@ -/* - * log_dump: dump current system states - * - * Copyright (c) 2016, 2018 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 "defs.h" -#include "dbus-handler.h" -#include "log_dump.h" -#include "shared/config.h" -#include "shared/spawn.h" -#include "shared/util.h" - -#define SYSTEM_INFO_KEY_BUILD_STRING "http://tizen.org/system/build.string" -#define DIR_UMASK 0022 - -static const struct option opts[] = { - { "normal", no_argument, 0, OPT_NORMAL }, - { "short", no_argument, 0, OPT_SHORT }, - { "dbus", no_argument, 0, OPT_DBUS }, - { 0, 0, 0, 0 } -}; - -/* crash worker configuration - for admin-selectable CrashRootPath */ -config_t config; -/* tzplaform vars */ -char *dir_scripts; -/* dynamic vars */ -char *dir_dump; -char *dir_log; -char *dir_debug; -char *dir_temp; // temp rootdir -char *dir_temp_logdump; // rootdir for this log_dump invocation -char *version_string; -/* timestamp */ -const char timestamp_format[] = "%Y%m%d%H%M%S"; -char timestamp_string[20]; /* as per format above */ - -static bool init_temp_dir(char *const temp_root, char **temp_dir) -{ - assert(temp_root); - assert(temp_dir); - - char *template = NULL, *path = NULL; - if (asprintf(&template, "%s/log.XXXXXX", temp_root) > 0) - path = mkdtemp(template); - - if (!path) { - _E("Unable to create temporary directory at mkdtemp(%s): %m", template); - free(template); - return false; - } - - *temp_dir = path; - return true; -} - -static char *crash_root_get(void) -{ - return config.crash_root_path; -} - -static bool init_vars(const char *crash_root) -{ - if (!crash_root) - return false; - - if (asprintf(&dir_log, "%s/log", crash_root) <= 0 - || asprintf(&dir_debug, "%s/debug", crash_root) <= 0 - || asprintf(&dir_dump, "%s/dump", crash_root) <= 0 - || asprintf(&dir_temp, "%s/temp", crash_root) <= 0) - goto fail; - - make_dir(crash_root, "temp", DIR_UMASK); - if (!init_temp_dir(dir_temp, &dir_temp_logdump)) - goto fail; - - make_dir(dir_temp_logdump, "log", DIR_UMASK); - make_dir(crash_root, "debug", DIR_UMASK); - - _D("config: dir_log is %s", dir_log); - _D("config: dir_dump is %s", dir_dump); - _D("config: dir_debug is %s", dir_debug); - _D("config: dir_temp is %s", dir_temp); - _D("config: dir_temp_logdump is %s", dir_temp_logdump); - - dir_scripts = strdup(tzplatform_getenv(TZ_SYS_DUMPGEN)); - _D("config: dir_scripts is %s", dir_scripts); - - if (system_info_get_platform_string(SYSTEM_INFO_KEY_BUILD_STRING, &version_string) != SYSTEM_INFO_ERROR_NONE) { - _W("Failed to system_info_get_platform_string for " SYSTEM_INFO_KEY_BUILD_STRING); - version_string = NULL; - } - _D("version_string is %s", version_string); - - time_t cur_time; - struct tm loc_tm; - cur_time = time(NULL); - localtime_r(&cur_time, &loc_tm); - strftime(timestamp_string, sizeof(timestamp_string), timestamp_format, &loc_tm); - _D("timestamp_string is %s", timestamp_string); - - assert(dir_log); - assert(dir_dump); - assert(dir_debug); - assert(dir_temp); - assert(dir_temp_logdump); - return true; - -fail: - free(dir_log); - free(dir_dump); - free(dir_debug); - free(dir_temp); - free(dir_temp_logdump); - return false; -} - -static void usage(void) -{ - printf("Usage: log_dump {OPTION}\n" - "Options:\n" - " --normal dump all logs (uses scripts from %s)\n" - " --short dump_systemstate logs only\n" - " --dbus become dbus service\n", - dir_scripts); -} - -static bool dump_scripts(char *const workdir, char *const scriptsdir) -{ - struct dirent **dir_list = NULL; - char command[PATH_MAX]; - int script_num, i; - - script_num = scandir(scriptsdir, &dir_list, NULL, NULL); - if (script_num < 0) { - _E("scandir %s: %m", scriptsdir); - return false; - } - - for (i = 0; i < script_num; i++) { - const char *const name = dir_list[i]->d_name; - int type = dir_list[i]->d_type; - - if (strcmp(name, ".") == 0 || strcmp(name, "..") == 0) - continue; - - if (type != DT_REG) { - _D("Ignoring: not a regular file: %s", name); - continue; - } - snprintf(command, sizeof(command), "%s/%s", scriptsdir, name); - if (access(command, X_OK) != 0) { - _W("Ignoring: file not executable: %s", command); - continue; - } - - _D("Calling scriptlet: %s", command); - - char *const av[] = {command, workdir, NULL}; - (void)spawn_wait(av, NULL, NULL, 0, NULL); - } - - for (i = 0; i < script_num; i++) - free(dir_list[i]); - free(dir_list); - - return true; -} - -static bool dump_systemstate(const char *const destdir, const char *const timestr, int *exit_code) -{ - char *dump_path = NULL; - - if (asprintf(&dump_path, "%s/log/dump_systemstate_%s.log", destdir, timestr) < 0) { - _E("asprintf: %m"); - return false; - } - - char *av[] = {DUMP_SYSTEMSTATE_BIN_PATH, "-k", "-d", "-j", "-e", "-f", dump_path, NULL}; - spawn_param_s param = { .fn = spawn_setstdout, .u.int_val = STDERR_FILENO }; - bool is_ok = spawn_wait(av, NULL, ¶m, 0, exit_code); - - free(dump_path); - - return is_ok; -} - -static bool compress(char *const destdir, char *const tempdir, char *const versionstr, char *const timestr, int *exit_code) -{ - char *archive_path = NULL; - - if (asprintf(&archive_path, "%s/log_dump_%s%s.zip", destdir, versionstr ?: "", timestr) < 0) { - _E("asprintf: %m"); - return false; - } - - _D("compress tempdir is %s", tempdir); - char *av[] = {"/bin/zip", "-qyr", archive_path, ".", NULL}; - spawn_param_s param1 = { .fn = spawn_nullstdfds }; - spawn_param_s param0 = { .fn = spawn_chdir, .u.char_ptr = tempdir, .next = ¶m1 }; - bool is_ok = spawn_wait(av, NULL, ¶m0, 0, exit_code); - - _I("Storing report at %s", archive_path); - - fsync_path(archive_path); - free(archive_path); - - return is_ok; -} - -int log_dump(int option) -{ - broadcast_logdump_start(); - - int ret = -1; - - if (!dump_systemstate(dir_temp_logdump, timestamp_string, NULL)) - goto out; - - if (option == OPT_NORMAL) - (void)dump_scripts(dir_temp_logdump, dir_scripts); - - compress(dir_debug, dir_temp_logdump, version_string, timestamp_string, NULL); - - /* cleanup */ - ret = remove_dir(dir_temp_logdump, 1); - if (ret < 0) - _W("Failed to delete dump directory at %s", dir_temp_logdump); - - ret = 0; -out: - broadcast_logdump_finish(); - - return ret; -} - -int delete_dump(void) -{ - _D("delete_dump called"); - - remove_dir(dir_log, 0); - remove_dir(dir_debug, 1); - remove_dir(dir_dump, 0); - remove_dir(dir_temp, 0); - - return 0; -} - -static void die(void) -{ - usage(); - exit(EXIT_FAILURE); -} - -int main(int argc, char *argv[]) -{ - int c, ret; - int option; - - if (!config_init(&config, CRASH_MANAGER_CONFIG_PATH)) - return false; - - /* need to do this first, because even usage() uses the vars */ - if (!init_vars(crash_root_get())) { - printf("Unable to initialize - please check program logs"); - exit(EXIT_FAILURE); - } - - if (argc < 2) - die(); - - option = -1; - while ((c = getopt_long_only(argc, argv, "", opts, NULL)) != -1) { - if (option >= 0 || c < _OPT_MIN || c > _OPT_MAX) - die(); - option = c; - } - - if (option == OPT_DBUS) - ret = log_dump_dbus(); - else - ret = log_dump(option); - - config_free(&config); - - return ret < 0 ? EXIT_FAILURE : EXIT_SUCCESS; -} diff --git a/src/log_dump/log_dump.conf b/src/log_dump/log_dump.conf deleted file mode 100644 index 4c82d0e..0000000 --- a/src/log_dump/log_dump.conf +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/src/log_dump/log_dump.h b/src/log_dump/log_dump.h deleted file mode 100644 index a6c87c7..0000000 --- a/src/log_dump/log_dump.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * log_dump - * - * Copyright (c) 2016, 2018 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 __LOGDUMP_H__ -#define __LOGDUMP_H__ - -#define LOG_TAG "LOG_DUMP" -#include "shared/log.h" - -enum { - _OPT_MIN, - OPT_NORMAL = _OPT_MIN, - OPT_SHORT, - OPT_DBUS, - _OPT_MAX = OPT_DBUS, -}; - -int log_dump(int option); -int delete_dump(void); - -#endif diff --git a/src/log_dump/log_dump.service.m4 b/src/log_dump/log_dump.service.m4 deleted file mode 100644 index be46f63..0000000 --- a/src/log_dump/log_dump.service.m4 +++ /dev/null @@ -1,11 +0,0 @@ -[Unit] -Description=log_dump service - -[Service] -Type=dbus -BusName=org.tizen.system.crash -ExecStart=/usr/bin/log_dump --dbus -SmackProcessLabel=System -SupplementaryGroups=log systemd-journal -Nice=-5 -KillMode=process diff --git a/src/log_dump/org.tizen.system.crash.service b/src/log_dump/org.tizen.system.crash.service deleted file mode 100644 index 5dfa56b..0000000 --- a/src/log_dump/org.tizen.system.crash.service +++ /dev/null @@ -1,4 +0,0 @@ -[D-BUS Service] -Name=org.tizen.system.crash -Exec=/bin/false -SystemdService=log_dump.service diff --git a/tests/system/CMakeLists.txt b/tests/system/CMakeLists.txt index 767703e..95e4474 100644 --- a/tests/system/CMakeLists.txt +++ b/tests/system/CMakeLists.txt @@ -28,9 +28,6 @@ configure_test("report_basic") configure_test("report_type_info") configure_test("without_core") configure_test("crash_root_path") -configure_test("log_dump_short") -configure_test("log_dump_normal") -configure_test("log_dump_crash_root_path") configure_test("dump_systemstate_extras") configure_test("livedumper") configure_test("extra_script") diff --git a/tests/system/log_dump_crash_root_path/log_dump_crash_root_path.sh.template b/tests/system/log_dump_crash_root_path/log_dump_crash_root_path.sh.template deleted file mode 100644 index aabc739..0000000 --- a/tests/system/log_dump_crash_root_path/log_dump_crash_root_path.sh.template +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash - -# Custom report path test - -if [ -z "${CRASH_WORKER_SYSTEM_TESTS}" ]; then - CRASH_WORKER_SYSTEM_TESTS="@CRASH_SYSTEM_TESTS_PATH@" -fi - -. ${CRASH_WORKER_SYSTEM_TESTS}/utils/minicore-utils.sh - -tmpdir=$(mktemp -d /tmp/logdump-crash-root-path-test.XXXXXX) - -CRASH_MANAGER_CONF=/etc/crash-manager.conf -mount -o rw,remount / -backup_file ${CRASH_MANAGER_CONF} -sed -ie 's,^CrashRootPath=.*,,g' ${CRASH_MANAGER_CONF} -echo "CrashRootPath=$tmpdir" >> ${CRASH_MANAGER_CONF} - -log_dump --short -logfile="${tmpdir}"/debug/* # there shall be only one file - -check_file_exists "$logfile" - -num=`unzip -qql "$logfile" | wc -l` -if [ $num -ne 2 ]; then - fail "'log_dump --short' report contains $num files - 2 expected" -fi - -restore_file ${CRASH_MANAGER_CONF} - -exit_ok diff --git a/tests/system/log_dump_normal/log_dump_normal.sh.template b/tests/system/log_dump_normal/log_dump_normal.sh.template deleted file mode 100644 index ef70cae..0000000 --- a/tests/system/log_dump_normal/log_dump_normal.sh.template +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash - -# Custom report path test - -if [ -z "${CRASH_WORKER_SYSTEM_TESTS}" ]; then - CRASH_WORKER_SYSTEM_TESTS="@CRASH_SYSTEM_TESTS_PATH@" -fi - -. ${CRASH_WORKER_SYSTEM_TESTS}/utils/minicore-utils.sh - -clean_logdump -dummy=$(mktemp $CRASH_DUMP_PATH/logdump-normal-test.XXXXXX) - -log_dump --normal -logfile="${LOGDUMP_RESULT_PATH}"/* # there shall be only one file - -check_file_exists "$logfile" -check_zip_contains "$logfile" 'log/dump_systemstate.*log$' -check_zip_contains "$logfile" 'log/system_log/$' -check_zip_contains "$logfile" 'log/system_log/dlog/kernel$' -check_zip_contains "$logfile" 'log/module_log/$' -check_zip_contains "$logfile" 'dump/$' - -check_file_not_exists "$dummy" - -clean_logdump - -exit_ok diff --git a/tests/system/log_dump_short/log_dump_short.sh.template b/tests/system/log_dump_short/log_dump_short.sh.template deleted file mode 100644 index 38d7885..0000000 --- a/tests/system/log_dump_short/log_dump_short.sh.template +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/bash - -# Custom report path test - -if [ -z "${CRASH_WORKER_SYSTEM_TESTS}" ]; then - CRASH_WORKER_SYSTEM_TESTS="@CRASH_SYSTEM_TESTS_PATH@" -fi - -. ${CRASH_WORKER_SYSTEM_TESTS}/utils/minicore-utils.sh - -clean_logdump - -dummy=$(mktemp $CRASH_DUMP_PATH/logdump-short-test.XXXXXX) - -log_dump --short -logfile="${LOGDUMP_RESULT_PATH}"/* # there shall be only one file - -check_file_exists "$logfile" - -num=`unzip -qql "$logfile" | wc -l` -if [ $num -ne 2 ]; then - fail "'log_dump --short' report contains $num files - 2 expected" -fi - -check_zip_contains "$logfile" 'log/dump_systemstate.*log$' -check_zip_contains "$logfile" 'log/$' - -check_file_exists "$dummy" - -clean_logdump - -exit_ok -- 2.7.4 From d70d319d3809e38e0c6e42c40944aaf57ce26975 Mon Sep 17 00:00:00 2001 From: Karol Lewandowski Date: Thu, 26 Sep 2019 21:42:09 +0200 Subject: [PATCH 02/16] Fix compilation on 64-bit architectures 64-bit architetures have lib in lib64, fix this by using cmake-provided information about target system directories. Change-Id: I794c89ad06b7bd80acd50acd3e64a36ffe86ea5d --- packaging/crash-worker.spec | 4 ++-- src/crash-manager/CMakeLists.txt | 6 ++++-- src/crash-service/CMakeLists.txt | 8 +++++--- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/packaging/crash-worker.spec b/packaging/crash-worker.spec index 1349392..baa227e 100644 --- a/packaging/crash-worker.spec +++ b/packaging/crash-worker.spec @@ -247,11 +247,11 @@ sed -i "/${pattern}/D" %{_sysconfdir}/ld.so.preload %files devel %{_includedir}/crash-manager.h %{_libdir}/libcrash-manager.so -%{_datadir}/pkgconfig/crash-manager.pc +%{_libdir}/pkgconfig/crash-manager.pc %if %{with crashservice} %{_includedir}/libcrash-service.h %{_libdir}/libcrash-service.so -%{_datadir}/pkgconfig/crash-service.pc +%{_libdir}/pkgconfig/crash-service.pc %endif %if %{with doc} diff --git a/src/crash-manager/CMakeLists.txt b/src/crash-manager/CMakeLists.txt index b935621..b38a084 100644 --- a/src/crash-manager/CMakeLists.txt +++ b/src/crash-manager/CMakeLists.txt @@ -14,6 +14,8 @@ SET(CRASH_MANAGER_SRCS main.c ) +INCLUDE(GNUInstallDirs) + INCLUDE(FindPkgConfig) pkg_check_modules(crash-manager_pkgs REQUIRED dlog @@ -53,7 +55,7 @@ ADD_EXECUTABLE(${CRASH_NOTIFY} dbus_notify.c) TARGET_LINK_LIBRARIES(${CRASH_NOTIFY} ${helper_pkgs_LDFLAGS} -pie) install(TARGETS ${CRASH_NOTIFY} DESTINATION libexec) -INSTALL(TARGETS libcrash-manager LIBRARY DESTINATION lib PUBLIC_HEADER DESTINATION include) +INSTALL(TARGETS libcrash-manager LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) INSTALL(TARGETS ${PROJECT_NAME} DESTINATION bin PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE @@ -68,7 +70,7 @@ INSTALL(FILES ${CMAKE_SOURCE_DIR}/src/${PROJECT_NAME}/crash-manager.conf PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ) INSTALL(FILES ${CMAKE_SOURCE_DIR}/src/${PROJECT_NAME}/crash-manager.pc - DESTINATION share/pkgconfig + DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ) INSTALL(FILES ${CMAKE_SOURCE_DIR}/src/${PROJECT_NAME}/70-${PROJECT_NAME}.conf diff --git a/src/crash-service/CMakeLists.txt b/src/crash-service/CMakeLists.txt index 37ad6b1..a8de738 100644 --- a/src/crash-service/CMakeLists.txt +++ b/src/crash-service/CMakeLists.txt @@ -7,6 +7,8 @@ SET(CRASH_SERVICE_SRCS crash-service.c ) +INCLUDE(GNUInstallDirs) + INCLUDE(FindPkgConfig) pkg_check_modules(crash-service_pkgs REQUIRED @@ -53,8 +55,8 @@ INSTALL(TARGETS ${PROJECT_NAME} DESTINATION bin PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) -INSTALL(TARGETS libcrash-service LIBRARY DESTINATION /usr/lib/ - PUBLIC_HEADER DESTINATION /usr/include) +INSTALL(TARGETS libcrash-service LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/crash-service.pc - DESTINATION share/pkgconfig) + DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) -- 2.7.4 From 766b8791820c94ff8cff56bfa5f6a953ce9c9f57 Mon Sep 17 00:00:00 2001 From: Karol Lewandowski Date: Sat, 28 Sep 2019 18:28:01 +0200 Subject: [PATCH 03/16] Make remaining macros behave like standard statements Change-Id: Id09a320422eeac2ddd459b47b023df8d4d975971 --- src/crash-manager/crash-manager.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/crash-manager/crash-manager.c b/src/crash-manager/crash-manager.c index dd2bab1..821d516 100644 --- a/src/crash-manager/crash-manager.c +++ b/src/crash-manager/crash-manager.c @@ -534,7 +534,7 @@ end: } // These macros are used in functions below -#define SNPRINTF_OR_EXIT_W(name, format, member) if (snprintf(name##_str, sizeof(name##_str), format, cinfo->member) < 0) goto out; +#define SNPRINTF_OR_EXIT_W(name, format, member) do { if (snprintf(name##_str, sizeof(name##_str), format, cinfo->member) < 0) goto out; } while (0) #define SNPRINTF_OR_EXIT(name, format) SNPRINTF_OR_EXIT_W(name, format, name##_info) static bool extra_script(const struct crash_info *cinfo, pid_t *pid) @@ -543,7 +543,7 @@ static bool extra_script(const struct crash_info *cinfo, pid_t *pid) return false; char pid_str[11]; - SNPRINTF_OR_EXIT(pid, "%d") + SNPRINTF_OR_EXIT(pid, "%d"); char *av[] = { config.extra_script, cinfo->pfx, pid_str, NULL }; spawn_param_s param = { .fn = spawn_setstdout, .u.int_val = STDERR_FILENO }; @@ -568,9 +568,9 @@ static void launch_dbus_notify(struct crash_info *cinfo) return; } - SNPRINTF_OR_EXIT(pid, "%d") - SNPRINTF_OR_EXIT(tid, "%d") - SNPRINTF_OR_EXIT(sig, "%d") + SNPRINTF_OR_EXIT(pid, "%d"); + SNPRINTF_OR_EXIT(tid, "%d"); + SNPRINTF_OR_EXIT(sig, "%d"); char *av[] = { CRASH_NOTIFY_BIN_PATH, "--cmdline", cinfo->cmd_line, @@ -604,11 +604,11 @@ static bool execute_minicoredump(struct crash_info *cinfo, int *exit_code) char pid_str[11], uid_str[11], gid_str[11], sig_str[11], time_str[11]; - SNPRINTF_OR_EXIT(pid, "%d") - SNPRINTF_OR_EXIT(uid, "%d") - SNPRINTF_OR_EXIT(gid, "%d") - SNPRINTF_OR_EXIT(sig, "%d") - SNPRINTF_OR_EXIT(time, "%ld") + SNPRINTF_OR_EXIT(pid, "%d"); + SNPRINTF_OR_EXIT(uid, "%d"); + SNPRINTF_OR_EXIT(gid, "%d"); + SNPRINTF_OR_EXIT(sig, "%d"); + SNPRINTF_OR_EXIT(time, "%ld"); /* Execute minicoredumper */ char *args[] = { @@ -664,7 +664,7 @@ static bool execute_livedumper(const struct crash_info *cinfo, int *exit_code) goto out; } - SNPRINTF_OR_EXIT(pid, "%d") + SNPRINTF_OR_EXIT(pid, "%d"); /* Execute livedumper */ char *args[] = { @@ -689,10 +689,10 @@ static bool execute_crash_stack(const struct crash_info *cinfo, int *exit_code) char pid_str[11], tid_str[11], sig_str[11], prstatus_fd_str[11]; bool is_ok = false; - SNPRINTF_OR_EXIT(pid, "%d") - SNPRINTF_OR_EXIT(tid, "%d") - SNPRINTF_OR_EXIT(sig, "%d") - SNPRINTF_OR_EXIT_W(prstatus_fd, "%d", prstatus_fd) + SNPRINTF_OR_EXIT(pid, "%d"); + SNPRINTF_OR_EXIT(tid, "%d"); + SNPRINTF_OR_EXIT(sig, "%d"); + SNPRINTF_OR_EXIT_W(prstatus_fd, "%d", prstatus_fd); /* Execute crash-stack */ char *args[] = { CRASH_STACK_BIN_PATH, -- 2.7.4 From a9dc259e856b43cfc7dd0ca746d4acefa41ed68b Mon Sep 17 00:00:00 2001 From: Mateusz Moscicki Date: Thu, 3 Oct 2019 17:46:29 +0200 Subject: [PATCH 04/16] Initialize variables to NULL Change-Id: I8d9abdea13e0a11ac3c0b55386a137f095767803 --- src/crash-manager/crash-manager.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/crash-manager/crash-manager.c b/src/crash-manager/crash-manager.c index 821d516..9714a6d 100644 --- a/src/crash-manager/crash-manager.c +++ b/src/crash-manager/crash-manager.c @@ -1111,6 +1111,11 @@ void crash_info_init(struct crash_info *cinfo) cinfo->result_path = NULL; 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) -- 2.7.4 From 6310e478f66c2a4dfb917352cba8a4a0b7fd6bf2 Mon Sep 17 00:00:00 2001 From: Mateusz Moscicki Date: Wed, 9 Oct 2019 10:26:06 +0200 Subject: [PATCH 05/16] Fix coverity issue - ensure that the buffer is null terminated Change-Id: Ia5eb44790320f48f6751aa247d1d600cb01a9f10 --- src/livedumper/core.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/livedumper/core.hpp b/src/livedumper/core.hpp index bd1737c..54bcf9b 100644 --- a/src/livedumper/core.hpp +++ b/src/livedumper/core.hpp @@ -462,6 +462,7 @@ class Core { char buff[PAGESIZE]; ReadFromFile(mem_fd, addr, buff, sizeof(buff)); + buff[sizeof(buff)-1] = 0; if (buff[0] != 0) { DumpData(mem_fd, core_file, addr, strnlen(buff, sizeof(buff)) + 1, "l_name"); -- 2.7.4 From 71bcf454717466db773f582d52180c81ca554f06 Mon Sep 17 00:00:00 2001 From: Karol Lewandowski Date: Thu, 26 Sep 2019 14:36:31 +0200 Subject: [PATCH 06/16] Release 5.5.23 This release drops log_dump, which is moved to separate repository. Change-Id: I305f4a758721c1b5566aa61693d2ad65ad281a5a --- packaging/crash-worker.spec | 2 +- packaging/crash-worker_system-tests.spec | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packaging/crash-worker.spec b/packaging/crash-worker.spec index 2d550a9..24c7ae8 100644 --- a/packaging/crash-worker.spec +++ b/packaging/crash-worker.spec @@ -14,7 +14,7 @@ Name: crash-worker Summary: Crash-manager -Version: 5.5.22 +Version: 5.5.23 Release: 1 Group: Framework/system License: Apache-2.0 and BSD diff --git a/packaging/crash-worker_system-tests.spec b/packaging/crash-worker_system-tests.spec index 2139828..300407f 100644 --- a/packaging/crash-worker_system-tests.spec +++ b/packaging/crash-worker_system-tests.spec @@ -8,7 +8,7 @@ Name: crash-worker_system-tests Summary: Package with binaries and scripts for crash-worker system tests -Version: 5.5.22 +Version: 5.5.23 Release: 1 Group: Framework/system License: Apache-2.0 and BSD -- 2.7.4 From 4fbd0e00d80224d866bc9d18c7979251a8be454a Mon Sep 17 00:00:00 2001 From: Karol Lewandowski Date: Thu, 10 Oct 2019 13:03:58 +0200 Subject: [PATCH 07/16] Drop log_dump scripts Change-Id: I9adf5d9cca48a3313338c881ee3227beb32880a3 --- dump_scripts/module_log.sh | 19 ------------------- dump_scripts/move_dump.sh | 12 ------------ dump_scripts/system_log.sh | 12 ------------ 3 files changed, 43 deletions(-) delete mode 100755 dump_scripts/module_log.sh delete mode 100755 dump_scripts/move_dump.sh delete mode 100755 dump_scripts/system_log.sh diff --git a/dump_scripts/module_log.sh b/dump_scripts/module_log.sh deleted file mode 100755 index 4c73e33..0000000 --- a/dump_scripts/module_log.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/sh -# -# Dump module log -# -PATH=/bin:/usr/bin:/sbin:/usr/sbin - -DUMP_DEST=$1/log/module_log -DUMP_SCRIPT_DIR=/opt/etc/dump.d/module.d - -mkdir -p ${DUMP_DEST} - -if [ -d ${DUMP_SCRIPT_DIR} ] -then - SCRIPTS=`/bin/ls ${DUMP_SCRIPT_DIR}` - - for SCRIPT in ${SCRIPTS}; do - /bin/sh ${DUMP_SCRIPT_DIR}/${SCRIPT} ${DUMP_DEST} - done -fi diff --git a/dump_scripts/move_dump.sh b/dump_scripts/move_dump.sh deleted file mode 100755 index 94d09c4..0000000 --- a/dump_scripts/move_dump.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh - -PATH=/bin:/usr/bin:/sbin:/usr/sbin - -. /etc/tizen-platform.conf - -set -ex - -DEST="$1/dump" -mkdir -p "$DEST" -mv -f "${TZ_SYS_CRASH}"/* "$DEST"/ - diff --git a/dump_scripts/system_log.sh b/dump_scripts/system_log.sh deleted file mode 100755 index 36beeb1..0000000 --- a/dump_scripts/system_log.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh -# -# Dump system log -# -PATH=/bin:/usr/bin:/sbin:/usr/sbin - -DUMP_DEST=$1/log/system_log - -mkdir -p ${DUMP_DEST} - -/bin/cp -fr /opt/var/log/* ${DUMP_DEST} -/bin/cp -fr /run/systemd/journal ${DUMP_DEST} -- 2.7.4 From 4b6000683c26c4fa289d6821a79431d5c3739911 Mon Sep 17 00:00:00 2001 From: Karol Lewandowski Date: Thu, 10 Oct 2019 13:30:03 +0200 Subject: [PATCH 08/16] upgrade script: change confusing comments Change-Id: I50c6ef0195a63f39ebbf40cbe68cccca4bad7f83 --- src/crash-manager/500.crash-manager-upgrade.sh.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/crash-manager/500.crash-manager-upgrade.sh.in b/src/crash-manager/500.crash-manager-upgrade.sh.in index 63b2d3f..ac4141f 100644 --- a/src/crash-manager/500.crash-manager-upgrade.sh.in +++ b/src/crash-manager/500.crash-manager-upgrade.sh.in @@ -1,12 +1,12 @@ #!/bin/sh #----------------------------------------------# -# crash-manager patch for upgrade (2.4 -> 3.0) # +# crash-manager patch for upgrade (5.0 -> 5.5) # #----------------------------------------------# PATH=/bin:/usr/bin:/sbin:/usr/sbin -rm -rf /opt/usr/share/crash # Crash path of Tizen 2.4 +rm -rf /opt/usr/share/crash # Crash path of Tizen 5.0 mkdir -p @CRASH_ROOT_PATH@ mkdir -p @CRASH_TEMP@ -- 2.7.4 From 4611af50d6db1dd8ee089cb3d3846c82d8fffd90 Mon Sep 17 00:00:00 2001 From: Karol Lewandowski Date: Thu, 10 Oct 2019 13:31:58 +0200 Subject: [PATCH 09/16] 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 From 82076809edf56498798d2a1190414fbe1bd6cfbc Mon Sep 17 00:00:00 2001 From: Mateusz Moscicki Date: Mon, 30 Sep 2019 12:55:42 +0200 Subject: [PATCH 10/16] Pass the "-s" (without_core) parameter to the minicoredumper if dump_core is set to 0 Change-Id: I04be2a58f72d7dbb2dbfacd4d0c4b6e23c97dcf1 --- packaging/crash-worker.spec | 2 +- src/crash-manager/crash-manager.c | 5 ++++- src/shared/util.c | 16 +++++++++++++++- src/shared/util.h | 2 ++ tests/system/without_core/without_core.sh.template | 14 ++++++++++++++ 5 files changed, 36 insertions(+), 3 deletions(-) diff --git a/packaging/crash-worker.spec b/packaging/crash-worker.spec index fc64bba..4d8fd96 100644 --- a/packaging/crash-worker.spec +++ b/packaging/crash-worker.spec @@ -47,7 +47,7 @@ Requires(post): gzip Requires: zip Requires: libelf Requires: libdw -Requires: %{_sbindir}/minicoredumper +Requires: minicoredumper >= 2.1.0 Requires: %{_bindir}/buxton2ctl %description diff --git a/src/crash-manager/crash-manager.c b/src/crash-manager/crash-manager.c index a96342e..86396db 100644 --- a/src/crash-manager/crash-manager.c +++ b/src/crash-manager/crash-manager.c @@ -571,6 +571,8 @@ static bool execute_minicoredump(struct crash_info *cinfo, int *exit_code) SNPRINTF_OR_EXIT(sig, "%d"); SNPRINTF_OR_EXIT(time, "%ld"); + const char *without_core_str = config.dump_core ? NULL : "-s"; + /* Execute minicoredumper */ char *args[] = { MINICOREDUMPER_BIN_PATH, // minicoredumper filename path @@ -588,6 +590,7 @@ static bool execute_minicoredump(struct crash_info *cinfo, int *exit_code) coredump_name, // coredump filename "-P", prstatus_fd_str, + (char *)without_core_str, // with or without core NULL }; @@ -596,7 +599,7 @@ static bool execute_minicoredump(struct crash_info *cinfo, int *exit_code) /* Minicoredumper must be executed to dump at least PRSTATUS for other tools, coredump, however, might have been disabled. */ - if (!config.dump_core) { + if (!config.dump_core && file_exists_in_dir(cinfo->pfx, coredump_name)) { if (remove_file_in_dir(cinfo->pfx, coredump_name) != 0) _E("Saving core disabled - removing coredump %s/%s failed: %m", cinfo->pfx, coredump_name); diff --git a/src/shared/util.c b/src/shared/util.c index d5917e7..6afc936 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -584,6 +584,21 @@ bool file_exists(const char *path) return stat(path, &buf) == 0; } +bool file_exists_in_dir(const char *base_dir, const char *file_name) +{ + char *path; + bool result = false; + + if (asprintf(&path, "%s/%s", base_dir, file_name) == -1) { + _E("Failed to asprintf for path: %m"); + } else { + result = file_exists(path); + free(path); + } + + return result; +} + bool write_to_file(const char *content, const char *base_dir, const char *file_name) { char *path; @@ -608,7 +623,6 @@ bool write_to_file(const char *content, const char *base_dir, const char *file_n } close(fd); - result = true; exit: free(path); return result; diff --git a/src/shared/util.h b/src/shared/util.h index 8e2a82f..f820997 100644 --- a/src/shared/util.h +++ b/src/shared/util.h @@ -70,6 +70,8 @@ bool string_ends_with(const char *string, const char *suffix); bool file_exists(const char *path); +bool file_exists_in_dir(const char *dir_path, const char *file_name); + bool write_to_file(const char *content, const char *base_dir, const char *file_name); #ifdef __cplusplus diff --git a/tests/system/without_core/without_core.sh.template b/tests/system/without_core/without_core.sh.template index ca13adf..d1371e1 100644 --- a/tests/system/without_core/without_core.sh.template +++ b/tests/system/without_core/without_core.sh.template @@ -39,4 +39,18 @@ if ls ${CRASH_DUMP_PATH}/kenny*/kenny*.coredump.tar > /dev/null; then fail "coredump file exists" fi +RESULT=$(cat ${CRASH_DUMP_PATH}/kenny*/kenny*info) +check "MemTotal:" +check "VmExe:" +check "VmSwap:" +check '[heap]' +check '/usr/lib/libm-.*.so' +check '/usr/lib/libc-.*.so' +check '/usr/lib/libgcc_s.so' +check '/usr/lib/libstdc++.*so' +check '/usr/lib/libpthread-.*.so' +check '/usr/lib/ld-.*.so' +check '[stack]' +check 'main.*kenny' + exit_ok -- 2.7.4 From 929ad348aa2e43becd68ce59a82d80b13a4ce36f Mon Sep 17 00:00:00 2001 From: Mateusz Moscicki Date: Tue, 8 Oct 2019 12:13:14 +0200 Subject: [PATCH 11/16] Reduce heap usage When *.so_info was writing, for TPK packages, a complete list of packages and paths was built, to find a RPM package that contains the file. Now only the list of files is kept in memory, and then RPM database is iterated to find suitable package. Change-Id: I779661de26afd959945d441ba5ad160c99a014b2 --- src/crash-manager/so-info.c | 214 +++++++++++++++++++++----------------------- 1 file changed, 104 insertions(+), 110 deletions(-) diff --git a/src/crash-manager/so-info.c b/src/crash-manager/so-info.c index bc1720b..b449791 100644 --- a/src/crash-manager/so-info.c +++ b/src/crash-manager/so-info.c @@ -37,6 +37,21 @@ #define BID_SNAME ".note.gnu.build-id" +struct rpm_info { + char *file_path; + char *app_name; + char *build_id; + char *rpm_info; +}; + +void rpm_info_free(struct rpm_info* ri) +{ + free(ri->file_path); + free(ri->app_name); + free(ri->build_id); + free(ri->rpm_info); + free(ri); +} static unsigned char *map_file(const char *filename, int64_t *size) { @@ -237,26 +252,26 @@ void free_rpm(rpmts ts) } } -char* get_rpm_info_as_string(Header h) +char* get_rpm_info_as_string_for_pkgname(Header h, const char *pkg_name) { - const char *name, *version, *release, *arch; + char *result = NULL; - name = headerGetString(h, RPMTAG_NAME); - version = headerGetString(h, RPMTAG_VERSION); - release = headerGetString(h, RPMTAG_RELEASE); - arch = headerGetString(h, RPMTAG_ARCH); + const char *version = headerGetString(h, RPMTAG_VERSION); + const char *release = headerGetString(h, RPMTAG_RELEASE); + const char *arch = headerGetString(h, RPMTAG_ARCH); - int info_len = strlen(name) + strlen(version) + - strlen(release) + strlen(arch) + 3; + if (version == NULL || release == NULL || arch == NULL) + _E("Failed to get version, release and arch for: %s", pkg_name); + else if (asprintf(&result, "%s;%s;%s;%s", pkg_name, version, release, arch) == -1) + _E("asprintf() error: %m"); - char *res = (char *)malloc(info_len + 1); - if (res == NULL) { - _E("Failed to allocate memory: %m"); - return NULL; - } - snprintf(res, info_len + 1, "%s;%s;%s;%s", name, version, release, arch); + return result; +} - return res; +char* get_rpm_info_as_string(Header h) +{ + const char *name = headerGetString(h, RPMTAG_NAME); + return get_rpm_info_as_string_for_pkgname(h, name); } char* get_rpm_info(rpmts ts, const char* filename) @@ -284,28 +299,23 @@ char* get_rpm_info(rpmts ts, const char* filename) return rpm_info; } -struct rpm_file { - char *pkg_name; - char *file_name; -}; - -GSList* create_tpk_list(rpmts ts) +void search_for_tpk(rpmts ts, GSList *pkgs) { - GSList *tpk_list = NULL; - rpmdbMatchIterator mi = rpmtsInitIterator(ts, RPMTAG_NAME, NULL, 0); if (mi == NULL) { _E("Failed to init rpmdb match iterator"); - goto end; + return; } - for (Header h = rpmdbNextIterator(mi); h; h = rpmdbNextIterator(mi)) { + guint count = g_slist_length(pkgs); // Initial number of packets with empty rpm_info + + for (Header h = rpmdbNextIterator(mi); count > 0 && h; h = rpmdbNextIterator(mi)) { const char *pkg_name = headerGetString(h, RPMTAG_NAME); if (pkg_name == NULL) continue; rpmfi fi = rpmfiNew(NULL, h, RPMTAG_FILENAMES, 0); - while (rpmfiNext(fi) != -1) { + while (count > 0 && rpmfiNext(fi) != -1) { const char *file_name = rpmfiFN(fi); size_t file_name_len = strlen(file_name); @@ -313,41 +323,28 @@ GSList* create_tpk_list(rpmts ts) strcmp(&file_name[file_name_len-4], ".tpk") != 0) continue; - const char *version = headerGetString(h, RPMTAG_VERSION); - const char *release = headerGetString(h, RPMTAG_RELEASE); - const char *arch = headerGetString(h, RPMTAG_ARCH); + for (GSList *iterator = pkgs; iterator; iterator = iterator->next) { + struct rpm_info *ri = (struct rpm_info *)iterator->data; + if (ri->rpm_info != NULL) + continue; - if (version == NULL || release == NULL || arch == NULL) - continue; + if (strstr(file_name, ri->app_name) == NULL) + continue; - struct rpm_file *rpm = (struct rpm_file*)malloc(sizeof(*rpm)); - if (rpm == NULL) { - _E("malloc() error (%m). Report (*.so_info) may be incomplete."); - continue; - } + char *info = get_rpm_info_as_string_for_pkgname(h, pkg_name); + if (info == NULL) + continue; - if (asprintf(&rpm->pkg_name, "%s;%s;%s;%s", - pkg_name, version, release, arch) == -1) { - _E("asprintf() error: %m"); - free(rpm); - continue; - } - rpm->file_name = strdup(file_name); - if (rpm->file_name == NULL) { - _E("strdup() error: %m"); - free(rpm->pkg_name); - free(rpm); - continue; + ri->rpm_info = info; + count--; + break; } - tpk_list = g_slist_append(tpk_list, rpm); } + + rpmfiFree(fi); } - rpmdbFreeIterator(mi); - if (tpk_list == NULL) - _E("No RPM packages containing *.tpk files found"); -end: - return tpk_list; + rpmdbFreeIterator(mi); } char* get_app_name_from_path(const char *file_path) @@ -368,85 +365,82 @@ char* get_app_name_from_path(const char *file_path) return NULL; } -char* get_rpm_info_for_tpk(GSList *tpk_list, const char *file_path) +void get_and_save_so_info(char *map_path, char *out_path) { - char *app_name = get_app_name_from_path(file_path); - if (app_name == NULL) - return NULL; - - char *res = NULL; - - for (GSList *iterator = tpk_list; iterator; iterator = iterator->next) { - struct rpm_file *rpm_pkg = (struct rpm_file *)iterator->data; - - if (strstr(rpm_pkg->file_name, app_name) != NULL) { - res = strdup(rpm_pkg->pkg_name); - break; - } + FILE *f = fopen(out_path, "w"); + if (f == NULL) { + _E("Failed to open file for writing %s: %m", out_path); + return; } - free(app_name); - return res; -} - -void get_and_save_so_info(char *map_path, char *out_path) -{ GSList *file_list = get_filepaths(map_path); - GSList *tpk_list = NULL; - - char *rpm_info; - FILE *f = fopen(out_path, "w"); + GSList *pkgs_not_found = NULL; rpmts ts = init_rpm(); - if (f == NULL) { - _E("Failed to open file for writing %s: %m", out_path); - } else { - char *build_id = NULL; - for (GSList *iterator = file_list; iterator; iterator = iterator->next) { - char *file_path = (char *)iterator->data; - - if (get_build_id(file_path, &build_id) <= 0 || build_id == NULL) - continue; + for (GSList *iterator = file_list; iterator; iterator = iterator->next) { + char *file_path = (char *)iterator->data; - int fret; + char *build_id = NULL; + if (get_build_id(file_path, &build_id) <= 0 || build_id == NULL) + continue; - rpm_info = get_rpm_info(ts, file_path); - if (rpm_info == NULL) { - if (tpk_list == NULL) - tpk_list = create_tpk_list(ts); - if (tpk_list != NULL) - rpm_info = get_rpm_info_for_tpk(tpk_list, file_path); + char *rpm_info = get_rpm_info(ts, file_path); + if (rpm_info == NULL) { + struct rpm_info *ri = malloc(sizeof(struct rpm_info)); + if (ri == NULL) { + _E("malloc error: %m"); + free(build_id); + break; } - if (rpm_info == NULL) - fret = fprintf(f, "%s %s\n", file_path, build_id); - else { - fret = fprintf(f, "%s %s %s\n", file_path, build_id, rpm_info); - free(rpm_info); + ri->file_path = strdup(file_path); + if (ri->file_path == NULL) { + _E("strdup error: %m"); + free(build_id); + free(ri); + break; } - + ri->app_name = get_app_name_from_path(file_path); + ri->build_id = build_id; + ri->rpm_info = NULL; + pkgs_not_found = g_slist_append(pkgs_not_found, ri); + } else { + int fret = fprintf(f, "%s %s %s\n", file_path, build_id, rpm_info); + free(rpm_info); free(build_id); if (fret < 0) { - _E("Failed to write to file %s", out_path); + _E("Failed to write to file %s: %m", out_path); break; } } - fclose(f); } - for (GSList *iterator = file_list; iterator; iterator = iterator->next) - free(iterator->data); + search_for_tpk(ts, pkgs_not_found); + + for (GSList *iterator = pkgs_not_found; iterator; iterator = iterator->next) { + struct rpm_info *ri = (struct rpm_info*)iterator->data; + int fret; + + if (ri->rpm_info == NULL) + fret = fprintf(f, "%s %s\n", ri->file_path, ri->build_id); + else + fret = fprintf(f, "%s %s %s\n", ri->file_path, ri->build_id, ri->rpm_info); + + if (fret < 0) + _E("Failed to write to file %s: %m", out_path); - for (GSList *iterator = tpk_list; iterator; iterator = iterator->next) { - struct rpm_file *rpm = (struct rpm_file*)iterator->data; - free(rpm->file_name); - free(rpm->pkg_name); - free(rpm); + rpm_info_free(ri); } + g_slist_free(pkgs_not_found); + + fclose(f); + + for (GSList *iterator = file_list; iterator; iterator = iterator->next) + free(iterator->data); + g_slist_free(file_list); - g_slist_free(tpk_list); free_rpm(ts); } -- 2.7.4 From c47e719d1e671324160a087bc125880af5722fae Mon Sep 17 00:00:00 2001 From: Karol Lewandowski Date: Thu, 10 Oct 2019 13:52:27 +0200 Subject: [PATCH 12/16] Release 5.5.24 This release brings: - optimizations to reduce memory footprint - removal of sys-assert (deprecated) Change-Id: Ie3df6181e3c991d14ee8ef0da21208551d1c7f02 --- packaging/crash-worker.spec | 2 +- packaging/crash-worker_system-tests.spec | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packaging/crash-worker.spec b/packaging/crash-worker.spec index 4d8fd96..15d598e 100644 --- a/packaging/crash-worker.spec +++ b/packaging/crash-worker.spec @@ -13,7 +13,7 @@ Name: crash-worker Summary: Crash-manager -Version: 5.5.23 +Version: 5.5.24 Release: 1 Group: Framework/system License: Apache-2.0 and BSD diff --git a/packaging/crash-worker_system-tests.spec b/packaging/crash-worker_system-tests.spec index 300407f..e8a56b3 100644 --- a/packaging/crash-worker_system-tests.spec +++ b/packaging/crash-worker_system-tests.spec @@ -8,7 +8,7 @@ Name: crash-worker_system-tests Summary: Package with binaries and scripts for crash-worker system tests -Version: 5.5.23 +Version: 5.5.24 Release: 1 Group: Framework/system License: Apache-2.0 and BSD -- 2.7.4 From e11218556bd8f1b86ca79d778e4cc0f4cddc20eb Mon Sep 17 00:00:00 2001 From: Karol Lewandowski Date: Fri, 18 Oct 2019 14:48:27 +0200 Subject: [PATCH 13/16] Ensure livedumper is installed for crash-service Change-Id: I5306c32142ecd2cec89a6b514af9a2f466a89dc6 --- packaging/crash-worker.spec | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packaging/crash-worker.spec b/packaging/crash-worker.spec index 15d598e..6ca15f7 100644 --- a/packaging/crash-worker.spec +++ b/packaging/crash-worker.spec @@ -49,6 +49,9 @@ Requires: libelf Requires: libdw Requires: minicoredumper >= 2.1.0 Requires: %{_bindir}/buxton2ctl +%if %{with crashservice} +Requires: %{name}-livedumper = %{version}-%{release} +%endif %description crash-manager -- 2.7.4 From e7e213842689ce85a83853620b72f5090f6f8e73 Mon Sep 17 00:00:00 2001 From: Mateusz Moscicki Date: Mon, 14 Oct 2019 16:29:39 +0200 Subject: [PATCH 14/16] Fix handling of child exit signal Change-Id: I01fcd716666876b6d4b03cce4a2f1e278118f547 --- src/crash-service/crash-service.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/crash-service/crash-service.c b/src/crash-service/crash-service.c index fa223f2..7b0a798 100644 --- a/src/crash-service/crash-service.c +++ b/src/crash-service/crash-service.c @@ -141,6 +141,8 @@ static gboolean read_result_cb(gpointer data) g_variant_new("(s)", report_path)); end: close(cb_data->read_fd); + + waitpid(cb_data->child_pid, NULL, 0); free(cb_data); return G_SOURCE_REMOVE; } @@ -313,7 +315,6 @@ static bool dbus_init(void) int main(void) { - signal(SIGCHLD, child_exit); loop = g_main_loop_new(NULL, false); if (!dbus_init()) { -- 2.7.4 From ca9c3174b9aecbbeaf0df1f6bcce230fdcfba2ad Mon Sep 17 00:00:00 2001 From: Mateusz Moscicki Date: Mon, 21 Oct 2019 15:04:09 +0200 Subject: [PATCH 15/16] Release 5.5.25: Converity fix This release brings: - Add check if sh_entsize is zero (coverity fix) - Ensure child termination is handled properly in crash-service Change-Id: I91f400d1e747fbd84894d77b6f215fb5efc03635 --- packaging/crash-worker.spec | 2 +- packaging/crash-worker_system-tests.spec | 2 +- src/livedumper/core.hpp | 4 ++++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packaging/crash-worker.spec b/packaging/crash-worker.spec index 6ca15f7..e4d58a0 100644 --- a/packaging/crash-worker.spec +++ b/packaging/crash-worker.spec @@ -13,7 +13,7 @@ Name: crash-worker Summary: Crash-manager -Version: 5.5.24 +Version: 5.5.25 Release: 1 Group: Framework/system License: Apache-2.0 and BSD diff --git a/packaging/crash-worker_system-tests.spec b/packaging/crash-worker_system-tests.spec index e8a56b3..163c147 100644 --- a/packaging/crash-worker_system-tests.spec +++ b/packaging/crash-worker_system-tests.spec @@ -8,7 +8,7 @@ Name: crash-worker_system-tests Summary: Package with binaries and scripts for crash-worker system tests -Version: 5.5.24 +Version: 5.5.25 Release: 1 Group: Framework/system License: Apache-2.0 and BSD diff --git a/src/livedumper/core.hpp b/src/livedumper/core.hpp index 54bcf9b..2e4a8c4 100644 --- a/src/livedumper/core.hpp +++ b/src/livedumper/core.hpp @@ -306,6 +306,10 @@ class Core { } sym_data->data = elf_getdata(scn, nullptr); + if (sym_data->shdr.sh_entsize == 0) { + logger.log_info("sh_entsize is zero for %s", lib.c_str()); + return nullptr; + } sym_data->count = sym_data->shdr.sh_size / sym_data->shdr.sh_entsize; return sym_data; -- 2.7.4 From 9c7f3bed10e7d52c4800b8248f335d2cfb78199c Mon Sep 17 00:00:00 2001 From: Mateusz Moscicki Date: Mon, 21 Oct 2019 16:26:34 +0200 Subject: [PATCH 16/16] Release 5.5.26: Coverity fix This release brings: - Fix memory leak Change-Id: Ida144b8ca6bd3f5ca954ef8478545f3dfff293e0 --- packaging/crash-worker.spec | 2 +- packaging/crash-worker_system-tests.spec | 2 +- src/livedumper/core.hpp | 3 +++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/packaging/crash-worker.spec b/packaging/crash-worker.spec index e4d58a0..41fe249 100644 --- a/packaging/crash-worker.spec +++ b/packaging/crash-worker.spec @@ -13,7 +13,7 @@ Name: crash-worker Summary: Crash-manager -Version: 5.5.25 +Version: 5.5.26 Release: 1 Group: Framework/system License: Apache-2.0 and BSD diff --git a/packaging/crash-worker_system-tests.spec b/packaging/crash-worker_system-tests.spec index 163c147..f289f5e 100644 --- a/packaging/crash-worker_system-tests.spec +++ b/packaging/crash-worker_system-tests.spec @@ -8,7 +8,7 @@ Name: crash-worker_system-tests Summary: Package with binaries and scripts for crash-worker system tests -Version: 5.5.25 +Version: 5.5.26 Release: 1 Group: Framework/system License: Apache-2.0 and BSD diff --git a/src/livedumper/core.hpp b/src/livedumper/core.hpp index 2e4a8c4..e9ae8dc 100644 --- a/src/livedumper/core.hpp +++ b/src/livedumper/core.hpp @@ -308,6 +308,9 @@ class Core { sym_data->data = elf_getdata(scn, nullptr); if (sym_data->shdr.sh_entsize == 0) { logger.log_info("sh_entsize is zero for %s", lib.c_str()); + elf_end(sym_data->elf); + close(sym_data->fd); + delete sym_data; return nullptr; } sym_data->count = sym_data->shdr.sh_size / sym_data->shdr.sh_entsize; -- 2.7.4