struct sr_core_stacktrace * sr_core_stacktrace_from_gdb(const char *gdb_output, const char *core_file, const char *exe_file, char **error_msg) { /* I'm not going to rewrite it now since the function is not being used. */ assert(error_msg); /* Initialize error_msg to 'no error'. */ *error_msg = NULL; struct core_handle *ch = open_coredump(core_file, exe_file, error_msg); if (*error_msg) return NULL; struct sr_gdb_stacktrace *gdb_stacktrace; struct sr_location location; sr_location_init(&location); gdb_stacktrace = sr_gdb_stacktrace_parse(&gdb_output, &location); if (!gdb_stacktrace) { *error_msg = sr_location_to_string(&location); core_handle_free(ch); return NULL; } struct sr_core_stacktrace *core_stacktrace = sr_core_stacktrace_new(); for (struct sr_gdb_thread *gdb_thread = gdb_stacktrace->threads; gdb_thread; gdb_thread = gdb_thread->next) { struct sr_core_thread *core_thread = sr_core_thread_new(); for (struct sr_gdb_frame *gdb_frame = gdb_thread->frames; gdb_frame; gdb_frame = gdb_frame->next) { if (gdb_frame->signal_handler_called) continue; struct sr_core_frame *core_frame = resolve_frame(ch->dwfl, gdb_frame->address, false); core_thread->frames = sr_core_frame_append(core_thread->frames, core_frame); } if (sr_gdb_stacktrace_find_crash_thread(gdb_stacktrace) == gdb_thread) { core_stacktrace->crash_thread = core_thread; } core_stacktrace->threads = sr_core_thread_append( core_stacktrace->threads, core_thread); } core_stacktrace->signal = get_signal_number(ch->eh, core_file); core_stacktrace->executable = realpath(exe_file, NULL); core_handle_free(ch); sr_gdb_stacktrace_free(gdb_stacktrace); return core_stacktrace; }
struct sr_report * sr_abrt_report_from_dir(const char *directory, char **error_message) { struct sr_report *report = sr_report_new(); /* Report type. */ char *type_contents = file_contents(directory, "type", error_message); if (!type_contents) { sr_report_free(report); return NULL; } report->report_type = sr_abrt_type_from_type(type_contents); free(type_contents); /* Operating system. */ report->operating_system = sr_abrt_operating_system_from_dir( directory, error_message); if (!report->operating_system) { sr_report_free(report); return NULL; } /* Component name. */ report->component_name = file_contents(directory, "component", error_message); /* RPM packages. */ report->rpm_packages = sr_abrt_rpm_packages_from_dir( directory, error_message); if (!report->rpm_packages) { sr_report_free(report); return NULL; } /* Core stacktrace. */ if (report->report_type == SR_REPORT_CORE) { char *core_backtrace_contents = file_contents(directory, "core_backtrace", error_message); if (!core_backtrace_contents) { sr_report_free(report); return NULL; } report->stacktrace = (struct sr_stacktrace *)sr_core_stacktrace_from_json_text( core_backtrace_contents, error_message); free(core_backtrace_contents); if (!report->stacktrace) { sr_report_free(report); return NULL; } } /* Python stacktrace. */ if (report->report_type == SR_REPORT_PYTHON) { char *backtrace_contents = file_contents(directory, "backtrace", error_message); if (!backtrace_contents) { sr_report_free(report); return NULL; } /* Parse the Python stacktrace. */ struct sr_location location; sr_location_init(&location); const char *contents_pointer = backtrace_contents; report->stacktrace = (struct sr_stacktrace *)sr_python_stacktrace_parse( &contents_pointer, &location); free(backtrace_contents); if (!report->stacktrace) { *error_message = sr_location_to_string(&location); sr_report_free(report); return NULL; } } /* Kerneloops stacktrace. */ if (report->report_type == SR_REPORT_KERNELOOPS) { /* Determine kernel version */ char *kernel_contents = file_contents(directory, "kernel", error_message); if (!kernel_contents) { sr_report_free(report); return NULL; } /* Load the Kerneloops stacktrace */ char *backtrace_contents = file_contents(directory, "backtrace", error_message); if (!backtrace_contents) { sr_report_free(report); return NULL; } /* Parse the Kerneloops stacktrace. */ struct sr_location location; sr_location_init(&location); const char *contents_pointer = backtrace_contents; struct sr_koops_stacktrace *stacktrace = sr_koops_stacktrace_parse( &contents_pointer, &location); stacktrace->version = kernel_contents; report->stacktrace = (struct sr_stacktrace *)stacktrace; free(backtrace_contents); if (!report->stacktrace) { *error_message = sr_location_to_string(&location); sr_report_free(report); return NULL; } } /* Java stacktrace. */ if (report->report_type == SR_REPORT_JAVA) { char *backtrace_contents = file_contents(directory, "backtrace", error_message); if (!backtrace_contents) { sr_report_free(report); return NULL; } /* Parse the Java stacktrace. */ struct sr_location location; sr_location_init(&location); const char *contents_pointer = backtrace_contents; report->stacktrace = (struct sr_stacktrace *)sr_java_stacktrace_parse( &contents_pointer, &location); free(backtrace_contents); if (!report->stacktrace) { *error_message = sr_location_to_string(&location); sr_report_free(report); return NULL; } } /* Ruby stacktrace. */ if (report->report_type == SR_REPORT_RUBY) { char *backtrace_contents = file_contents(directory, "backtrace", error_message); if (!backtrace_contents) { sr_report_free(report); return NULL; } /* Parse the Ruby stacktrace. */ struct sr_location location; sr_location_init(&location); const char *contents_pointer = backtrace_contents; report->stacktrace = (struct sr_stacktrace *)sr_ruby_stacktrace_parse( &contents_pointer, &location); free(backtrace_contents); if (!report->stacktrace) { *error_message = sr_location_to_string(&location); sr_report_free(report); return NULL; } } return report; }