+option(WITH_CORE_DUMP "builds with support for core dump files (with GPL2 license)")
set(CRASH_STACK_BIN "crash-stack")
set(CRASH_STACK_SRCS crash-stack.c)
endif()
add_executable(${CRASH_STACK_BIN} ${CRASH_STACK_SRCS})
-set_property(TARGET ${CRASH_STACK_BIN} APPEND PROPERTY COMPILE_FLAGS "-DUPGRADE_ARM_STACK_UNWIND")
-#set_property(TARGET ${CRASH_STACK_BIN} APPEND PROPERTY COMPILE_FLAGS "-DUPGRADE_ARM_STACK_UNWIND -DUNW_DEBUG")
+
+if (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "armv7l")
+ set_property(TARGET ${CRASH_STACK_BIN} APPEND_STRING PROPERTY COMPILE_FLAGS " -DUPGRADE_ARM_STACK_UNWIND")
+# set_property(TARGET ${CRASH_STACK_BIN} APPEND_STRING PROPERTY COMPILE_FLAGS "-DUPGRADE_ARM_STACK_UNWIND -DUNW_DEBUG")
+endif()
+
+if (${WITH_CORE_DUMP} STREQUAL "ON")
+ set_property(TARGET ${CRASH_STACK_BIN} APPEND_STRING PROPERTY COMPILE_FLAGS " -DWITH_CORE_DUMP")
+endif()
+
target_link_libraries(${CRASH_STACK_BIN} dw elf ebl dl stdc++)
install(TARGETS ${CRASH_STACK_BIN} DESTINATION libexec)
#include <stdio.h>
#include <libelf.h>
#include <elfutils/libdwfl.h>
+#ifdef WITH_CORE_DUMP
#include <elfutils/libebl.h>
+#endif
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
mappings->elems++;
}
}
- /* fprintf(errfile, "Got module %s @0x%llx\n", name, (long long)address);*/
return DWARF_CB_OK;
}
fprintf(errfile, "failed to get value from core file\n");
}
-static void updateMapping(Mappings *mappings, uint64_t mapping_start, uint64_t mapping_end,
- uint64_t offset, const char *name)
-{
- int i;
- for (i = 0; i < mappings->elems; i++) {
- if (mappings->tab[i].m_start == mapping_start) {
- mappings->tab[i].m_end = mapping_end;
- mappings->tab[i].m_name = name;
- mappings->tab[i].m_offset = offset;
- mappings->tab[i].m_fd = open(name, O_RDONLY);
- mappings->tab[i].m_elf = elf_begin(mappings->tab[i].m_fd, ELF_C_READ_MMAP, NULL);
- return;
- }
- }
-}
-
static void parse_note_file(Elf *elf, const char *desc, uint64_t *values_cnt, uint64_t *page_size,
size_t *addr_size, const char **values, const char **filenames)
{
return NULL;
}
-#if _ELFUTILS_PREREQ(0, 158)
+#if _ELFUTILS_PREREQ(0,158)
if (dwfl_linux_proc_attach(dwfl, pid, true) < 0) {
fprintf(errfile, "process %d : dwfl attach failed (%s)\n", pid, dwfl_errmsg(-1));
dwfl_end(dwfl);
return dwfl;
}
+/*
+ * This function will open core file regardless of WITH_CORE_DUMP setting.
+ * It may help with detecting issues with using dwfl even without support for dumps.
+ */
static Dwfl *open_dwfl_with_core(Elf *core, const char *core_file_name)
{
static const Dwfl_Callbacks core_callbacks = {
return NULL;
}
-#if _ELFUTILS_PREREQ(0, 158)
+#if _ELFUTILS_PREREQ(0,158)
if (dwfl_core_file_report(dwfl, core, NULL) < 0)
#else
if (dwfl_core_file_report(dwfl, core) < 0)
return NULL;
}
-#if _ELFUTILS_PREREQ(0, 158)
+#if _ELFUTILS_PREREQ(0,158)
if (dwfl_core_file_attach(dwfl, core) < 0) {
fprintf(errfile, "%s : dwfl attach failed (%s)\n", core_file_name, dwfl_errmsg(-1));
dwfl_end(dwfl);
return 0;
}
+#ifdef WITH_CORE_DUMP
+static void updateMapping(Mappings *mappings, uint64_t mapping_start, uint64_t mapping_end,
+ uint64_t offset, const char *name)
+{
+ int i;
+ for (i = 0; i < mappings->elems; i++) {
+ if (mappings->tab[i].m_start == mapping_start) {
+ mappings->tab[i].m_end = mapping_end;
+ mappings->tab[i].m_name = name;
+ mappings->tab[i].m_offset = offset;
+ mappings->tab[i].m_fd = open(name, O_RDONLY);
+ mappings->tab[i].m_elf = elf_begin(mappings->tab[i].m_fd, ELF_C_READ_MMAP, NULL);
+ return;
+ }
+ }
+}
+#endif
+
static Elf_Data *get_registers_core(Elf *core, const char *core_file_name, Mappings *mappings)
{
+ Elf_Data *notes = NULL;
+#ifdef WITH_CORE_DUMP
GElf_Phdr mem;
GElf_Phdr *phdr = gelf_getphdr(core, 0, &mem);
pos = new_pos;
}
ebl_closebackend(ebl);
+#else
+ fprintf(errfile, "Configured without support for core dump files\n");
+#endif
return notes;
}