From 82076809edf56498798d2a1190414fbe1bd6cfbc Mon Sep 17 00:00:00 2001 From: Mateusz Moscicki Date: Mon, 30 Sep 2019 12:55:42 +0200 Subject: [PATCH 01/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 02/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 03/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 04/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 05/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 06/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 07/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 From b25d28ddcc0a14e13a9282b14c9831a977a5fa47 Mon Sep 17 00:00:00 2001 From: Mateusz Moscicki Date: Tue, 22 Oct 2019 11:08:29 +0200 Subject: [PATCH 08/16] Add full coredump test Change-Id: I6c49d87be5a34e86744a929bfd16c2476cc39a0b --- packaging/crash-worker_system-tests.manifest | 1 + packaging/crash-worker_system-tests.spec | 1 + tests/system/CMakeLists.txt | 1 + tests/system/full_core/full_core.sh.template | 54 ++++++++++++++++++++++++++++ 4 files changed, 57 insertions(+) create mode 100755 tests/system/full_core/full_core.sh.template diff --git a/packaging/crash-worker_system-tests.manifest b/packaging/crash-worker_system-tests.manifest index 15573a3..83fdab3 100644 --- a/packaging/crash-worker_system-tests.manifest +++ b/packaging/crash-worker_system-tests.manifest @@ -3,6 +3,7 @@ + diff --git a/packaging/crash-worker_system-tests.spec b/packaging/crash-worker_system-tests.spec index f289f5e..c965ee4 100644 --- a/packaging/crash-worker_system-tests.spec +++ b/packaging/crash-worker_system-tests.spec @@ -56,6 +56,7 @@ cd tests/system %files -f debugfiles.list %manifest %{name}.manifest %defattr(0750,system_fw,system_fw) +%{_libdir}/crash-worker_system-tests/full_core/full_core.sh %{_libdir}/crash-worker_system-tests/check_minicore_mem/check_minicore_mem.sh %{_libdir}/crash-worker_system-tests/check_minicore_mem/cp.sh %{_libdir}/crash-worker_system-tests/cmp_backtraces/cmp_backtraces.sh diff --git a/tests/system/CMakeLists.txt b/tests/system/CMakeLists.txt index 95e4474..b5423c1 100644 --- a/tests/system/CMakeLists.txt +++ b/tests/system/CMakeLists.txt @@ -34,6 +34,7 @@ configure_test("extra_script") configure_test("dbus_notify") configure_test("output_param") configure_test("libcrash-service") +configure_test("full_core") configure_file("run.sh.template" "run.sh" @ONLY) INSTALL(FILES run.sh DESTINATION ${CRASH_SYSTEM_TESTS_PATH}) diff --git a/tests/system/full_core/full_core.sh.template b/tests/system/full_core/full_core.sh.template new file mode 100755 index 0000000..df74f75 --- /dev/null +++ b/tests/system/full_core/full_core.sh.template @@ -0,0 +1,54 @@ +#!/bin/bash + +# Check the full coredump + +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_crash_dump + +MINICOREDUMPER_DIR=/etc/minicoredumper/ +CONFIG_FILE=${MINICOREDUMPER_DIR}/generic.recept.json +DOTNET_CONFIG_FILE=${MINICOREDUMPER_DIR}/dotnet.recept.json +BACKUP_CONFIG_FILE=/tmp/generic.recept.json + +function backup_config { + cp ${CONFIG_FILE} ${BACKUP_CONFIG_FILE} +} + +function modify_config { + cp ${DOTNET_CONFIG_FILE} ${CONFIG_FILE} +} + +function restore { + cp ${BACKUP_CONFIG_FILE} ${CONFIG_FILE} + popd +} + +trap restore 0 +pushd ${CRASH_DUMP_PATH} + +backup_config +modify_config + +{ + ${CRASH_WORKER_SYSTEM_TESTS}/utils/kenny & + sleep 1 + kill -6 $! +} 1> /dev/null 2>&1 + +sleep 2 + +wait_for_file ${CRASH_DUMP_PATH}/*kenny*zip + +unzip ${CRASH_DUMP_PATH}/*kenny*zip + +RESULT=`gdb ${CRASH_WORKER_SYSTEM_TESTS}/utils/kenny ${CRASH_DUMP_PATH}/*kenny*/kenny*coredump --batch -ex "thread apply all bt"` + +check "MAGICNAME.*id=.*kenny.cpp:31" +check "run.*id=.*kenny.cpp:56" + +exit_ok -- 2.7.4 From 4284a1845667b2decb10cdab7f9404ade2b847e6 Mon Sep 17 00:00:00 2001 From: Mateusz Moscicki Date: Tue, 15 Oct 2019 11:00:00 +0200 Subject: [PATCH 09/16] Extract libcrash-service to a separate package Change-Id: Ife9bf0274c226f3a2e85e8d97db567e0da8d4d4a --- packaging/crash-worker.spec | 10 +++++++++- packaging/crash-worker_system-tests.spec | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/packaging/crash-worker.spec b/packaging/crash-worker.spec index 41fe249..5003954 100644 --- a/packaging/crash-worker.spec +++ b/packaging/crash-worker.spec @@ -56,6 +56,12 @@ Requires: %{name}-livedumper = %{version}-%{release} %description crash-manager +%package libcrash-service +Summary: libcrash-service + +%description libcrash-service +libcrash-service provides API to communicate with crash-service + %package devel Requires: crash-worker Summary: Crash-manager development package @@ -180,12 +186,14 @@ mkdir -p %{buildroot}%{crash_temp} %attr(-,root,root) %{_unitdir}/crash-service.service %attr(-,root,root) %{_sysconfdir}/dbus-1/system.d/crash-service.conf %attr(-,root,root) %{_datadir}/dbus-1/system-services/org.tizen.system.crash.livedump.service -%{_libdir}/libcrash-service.so.* %endif #upgrade script %attr(-,root,root) %{upgrade_script_path}/500.crash-manager-upgrade.sh +%files libcrash-service +%{_libdir}/libcrash-service.so.* + %files devel %{_includedir}/crash-manager.h %{_libdir}/libcrash-manager.so diff --git a/packaging/crash-worker_system-tests.spec b/packaging/crash-worker_system-tests.spec index c965ee4..b4fad73 100644 --- a/packaging/crash-worker_system-tests.spec +++ b/packaging/crash-worker_system-tests.spec @@ -29,6 +29,7 @@ Requires: /bin/bash Requires: /usr/bin/unzip Requires: /usr/bin/mcookie Requires: crash-worker +Requires: crash-worker-libcrash-service Requires: %{_sbindir}/minicoredumper %description -- 2.7.4 From ff274f5689c2dd52493ecd8a6d56d7a64dc2de83 Mon Sep 17 00:00:00 2001 From: Mateusz Moscicki Date: Wed, 16 Oct 2019 14:20:47 +0200 Subject: [PATCH 10/16] Fix preparing report for applications with too long name Crash-manager gets the application name from /proc//cmdline, but this value can be modified (e.g. by modify argv[0]), and may be incorrect. Now report file name is prepared based on the executable path. Change-Id: Ia7f3b495bf501a67620888c99d49832e0fd6a23d --- src/crash-manager/crash-manager.c | 4 ++-- src/crash-manager/so-info.c | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/crash-manager/crash-manager.c b/src/crash-manager/crash-manager.c index 86396db..8bf424a 100644 --- a/src/crash-manager/crash-manager.c +++ b/src/crash-manager/crash-manager.c @@ -363,7 +363,7 @@ bool set_crash_info(struct crash_info *cinfo) return false; } - if (asprintf(&cinfo->name, "%s_%d_%s", basename(cinfo->cmd_line), + if (asprintf(&cinfo->name, "%s_%d_%s", basename(cinfo->cmd_path), cinfo->pid_info, date) == -1) { _E("Failed to snprintf for name"); cinfo->name = NULL; @@ -582,7 +582,7 @@ static bool execute_minicoredump(struct crash_info *cinfo, int *exit_code) sig_str, // %s - number of signal time_str, // %t - time of dump "localhost", // %h - hostname - basename(cinfo->cmd_line), // %e - exe name (need for result filename) + basename(cinfo->cmd_path), // %e - exe name (need for result filename) MINICOREDUMPER_CONFIG_PATH, // config file "-d", cinfo->pfx, // temp dir diff --git a/src/crash-manager/so-info.c b/src/crash-manager/so-info.c index b449791..a0ae2dc 100644 --- a/src/crash-manager/so-info.c +++ b/src/crash-manager/so-info.c @@ -401,6 +401,10 @@ void get_and_save_so_info(char *map_path, char *out_path) break; } ri->app_name = get_app_name_from_path(file_path); + if (ri->app_name == NULL) { + free(ri); + continue; + } ri->build_id = build_id; ri->rpm_info = NULL; pkgs_not_found = g_slist_append(pkgs_not_found, ri); -- 2.7.4 From ab88e92b1eb4bae8d94523141afb2d59ffc5e6e6 Mon Sep 17 00:00:00 2001 From: Karol Lewandowski Date: Wed, 6 Nov 2019 09:08:11 +0100 Subject: [PATCH 11/16] Allow new special priv_livecoredump group members to use livedump API Change-Id: Ia210a100bc2af1ce323ef90331e31950d8a8b277 --- src/crash-service/crash-service.conf | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/crash-service/crash-service.conf b/src/crash-service/crash-service.conf index 904d93a..f1f1e74 100644 --- a/src/crash-service/crash-service.conf +++ b/src/crash-service/crash-service.conf @@ -7,6 +7,11 @@ send_interface="org.tizen.system.crash.livedump" send_member="livedump_pid"/> + + + -- 2.7.4 From b55fb70677364e21c4c2ceb7c25d52496b280cd7 Mon Sep 17 00:00:00 2001 From: Karol Lewandowski Date: Wed, 6 Nov 2019 11:41:18 +0100 Subject: [PATCH 12/16] Provide libcrash-service package, not crash-worker-libcrash-service Change-Id: I4def644bfb149b3d2eaf228addc38e011d5d5172 --- packaging/crash-worker.spec | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/packaging/crash-worker.spec b/packaging/crash-worker.spec index 5003954..c4ddbfc 100644 --- a/packaging/crash-worker.spec +++ b/packaging/crash-worker.spec @@ -56,16 +56,15 @@ Requires: %{name}-livedumper = %{version}-%{release} %description crash-manager -%package libcrash-service -Summary: libcrash-service -%description libcrash-service -libcrash-service provides API to communicate with crash-service +%package -n libcrash-service +Summary: libcrash-service provides API to communicate with crash-service +%description -n libcrash-service %package devel -Requires: crash-worker Summary: Crash-manager development package %description devel +Requires: libcrash-service This package provides library and header files. %if %{with doc} @@ -191,7 +190,7 @@ mkdir -p %{buildroot}%{crash_temp} #upgrade script %attr(-,root,root) %{upgrade_script_path}/500.crash-manager-upgrade.sh -%files libcrash-service +%files -n libcrash-service %{_libdir}/libcrash-service.so.* %files devel -- 2.7.4 From 6eaf84fd0d0d1363902de4094c9523df4894faac Mon Sep 17 00:00:00 2001 From: Karol Lewandowski Date: Wed, 6 Nov 2019 12:37:19 +0100 Subject: [PATCH 13/16] spec: Standarize field justification to spaces Change-Id: I51e143520f84d3194c8735101cc93f4b4dd84fff --- packaging/crash-worker.spec | 73 +++++++++++++++++++-------------------------- 1 file changed, 31 insertions(+), 42 deletions(-) diff --git a/packaging/crash-worker.spec b/packaging/crash-worker.spec index c4ddbfc..260c3ed 100644 --- a/packaging/crash-worker.spec +++ b/packaging/crash-worker.spec @@ -11,14 +11,14 @@ # NOTE: To disable coredump set DumpCore=0 in configuration file -Name: crash-worker -Summary: Crash-manager -Version: 5.5.26 -Release: 1 -Group: Framework/system -License: Apache-2.0 and BSD -Source0: %{name}-%{version}.tar.gz -Source1001: crash-worker.manifest +Name: crash-worker +Summary: Coredump handler and report generator for Tizen +Version: 5.5.26 +Release: 1 +Group: Framework/system +License: Apache-2.0 and BSD +Source0: %{name}-%{version}.tar.gz +Source1001: crash-worker.manifest BuildRequires: pkgconfig(dlog) BuildRequires: pkgconfig(libtzplatform-config) BuildRequires: pkgconfig(iniparser) @@ -27,12 +27,10 @@ BuildRequires: pkgconfig(glib-2.0) BuildRequires: pkgconfig(rpm) BuildRequires: cmake BuildRequires: pkgconfig(pkgmgr-info) - BuildRequires: pkgconfig(libunwind-generic) BuildRequires: libelf-devel libelf BuildRequires: libebl-devel libebl BuildRequires: libdw-devel libdw - %if %{with doc} BuildRequires: doxygen %endif @@ -44,51 +42,42 @@ BuildRequires: boost-devel Requires(post): coreutils Requires(post): tar Requires(post): gzip -Requires: zip -Requires: libelf -Requires: libdw -Requires: minicoredumper >= 2.1.0 -Requires: %{_bindir}/buxton2ctl +Requires: zip +Requires: libelf +Requires: libdw +Requires: minicoredumper >= 2.1.0 +Requires: %{_bindir}/buxton2ctl %if %{with crashservice} -Requires: %{name}-livedumper = %{version}-%{release} +Requires: %{name}-livedumper = %{version}-%{release} %endif - %description -crash-manager - -%package -n libcrash-service -Summary: libcrash-service provides API to communicate with crash-service -%description -n libcrash-service +%package -n libcrash-service +Summary: libcrash-service provides API to communicate with crash-service +%description -n libcrash-service -%package devel -Summary: Crash-manager development package -%description devel -Requires: libcrash-service -This package provides library and header files. +%package devel +Requires: libcrash-service +Summary: Crash-manager headers and library for linking +%description devel %if %{with doc} -%package doc -Summary: Documentation package for crash-worker -Group: Framework/System - -%description doc -This package provides development documentation for crash-worker. +%package doc +Summary: Documentation package for crash-worker +Group: Framework/System +%description doc %endif %if %{with tests} -%package tests -Summary: Package with binaries and data for crash-worker tests - -%description tests -This package contains installable tests in Bash. +%package tests +Summary: Package with binaries and data for crash-worker tests +%description tests %endif %if %{with livedumper} -%package livedumper -Summary: Livedumper allows to dump core of live process - -%description livedumper +%package livedumper +Summary: Livedumper allows to dump core of live process +%description livedumper %endif %prep -- 2.7.4 From 6bc4dd4a5702e658461fc0fce3ed5bf7567077e4 Mon Sep 17 00:00:00 2001 From: Karol Lewandowski Date: Fri, 8 Nov 2019 14:24:13 +0100 Subject: [PATCH 14/16] Release 6.0.1 Bump release version to next Tizen version. Changes: - Fix preparing report for applications with too long name - Allow new special priv_livecoredump group members to use livedump API - Minor fixes Change-Id: Iaa0374526fd110bd9f565a0afadc4044cd499fb7 --- 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 260c3ed..894ba34 100644 --- a/packaging/crash-worker.spec +++ b/packaging/crash-worker.spec @@ -13,7 +13,7 @@ Name: crash-worker Summary: Coredump handler and report generator for Tizen -Version: 5.5.26 +Version: 6.0.1 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 b4fad73..da6a9b6 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.26 +Version: 6.0.1 Release: 1 Group: Framework/system License: Apache-2.0 and BSD -- 2.7.4 From 78a42cd97bbf08f7ba112d6ffda59808bbf6d71e Mon Sep 17 00:00:00 2001 From: Mateusz Moscicki Date: Wed, 20 Nov 2019 10:33:16 +0100 Subject: [PATCH 15/16] Change crash-worker-libcrash-service requirement to libcrash-service Change-Id: I1fcc2886404daea67b6be86b6930bb567a0c3f32 --- packaging/crash-worker_system-tests.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/crash-worker_system-tests.spec b/packaging/crash-worker_system-tests.spec index da6a9b6..27edc9a 100644 --- a/packaging/crash-worker_system-tests.spec +++ b/packaging/crash-worker_system-tests.spec @@ -29,7 +29,7 @@ Requires: /bin/bash Requires: /usr/bin/unzip Requires: /usr/bin/mcookie Requires: crash-worker -Requires: crash-worker-libcrash-service +Requires: libcrash-service Requires: %{_sbindir}/minicoredumper %description -- 2.7.4 From 0e81102438d073aa4648eb657500a5aa12b9122e Mon Sep 17 00:00:00 2001 From: Mateusz Moscicki Date: Mon, 14 Oct 2019 14:00:40 +0200 Subject: [PATCH 16/16] Configure the crash-service so that it doesn't require root privileges Change-Id: I6bddc446a31449b7419074f10f795b8ee6c61714 --- TODO | 1 + src/crash-service/crash-service.conf | 6 ++++++ src/crash-service/crash-service.service.m4 | 5 +++++ src/dump_systemstate/dump_systemstate.c | 2 +- 4 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 TODO diff --git a/TODO b/TODO new file mode 100644 index 0000000..61aa716 --- /dev/null +++ b/TODO @@ -0,0 +1 @@ +* In the future "/usr/bin/pkgcmd --global" as system_fw user will stop working, so it needs to be changed to get installed applications for the global user and for the actual user. diff --git a/src/crash-service/crash-service.conf b/src/crash-service/crash-service.conf index f1f1e74..43534d9 100644 --- a/src/crash-service/crash-service.conf +++ b/src/crash-service/crash-service.conf @@ -12,6 +12,12 @@ send_interface="org.tizen.system.crash.livedump" send_member="livedump_pid"/> + + + + diff --git a/src/crash-service/crash-service.service.m4 b/src/crash-service/crash-service.service.m4 index f080f40..b4221fd 100644 --- a/src/crash-service/crash-service.service.m4 +++ b/src/crash-service/crash-service.service.m4 @@ -3,8 +3,13 @@ Description=crash service [Service] Type=dbus +User=crash_worker +Group=crash_worker +Capabilities=cap_dac_override,cap_dac_read_search,cap_sys_ptrace,cap_kill,cap_syslog=i +SecureBits=keep-caps BusName=org.tizen.system.crash.livedump ExecStart=/usr/bin/crash-service +SupplementaryGroups=log systemd-journal system_share SmackProcessLabel=System Nice=-5 KillMode=mixed diff --git a/src/dump_systemstate/dump_systemstate.c b/src/dump_systemstate/dump_systemstate.c index 30a8f35..f971350 100644 --- a/src/dump_systemstate/dump_systemstate.c +++ b/src/dump_systemstate/dump_systemstate.c @@ -215,7 +215,7 @@ int main(int argc, char *argv[]) if (arg_pkgs) { fprintf_fd(out_fd, "\n==== Installed packages (/usr/bin/pkgcmd -l)\n"); - char *pkgcmd_args[] = {"/usr/bin/pkgcmd", "-l", NULL}; + char *pkgcmd_args[] = {"/usr/bin/pkgcmd", "-l", "--global", NULL}; // see TODO file spawn_wait_checked(pkgcmd_args, NULL); } -- 2.7.4