[SATYR PATCH] Fix broken sr_stacktrace_parse
Martin Milata
mmilata at redhat.com
Wed Jun 26 09:54:23 UTC 2013
Did not work for any other crash types than "core" due to the wrong
function being called.
Signed-off-by: Martin Milata <mmilata at redhat.com>
---
lib/gdb_stacktrace.c | 3 ++-
lib/generic_stacktrace.h | 12 ++++++++----
lib/java_stacktrace.c | 3 ++-
lib/koops_stacktrace.c | 3 ++-
lib/python_stacktrace.c | 3 ++-
tests/java_stacktrace.at | 14 ++++++++++++++
tests/koops_stacktrace.at | 17 +++++++++++++++++
7 files changed, 47 insertions(+), 8 deletions(-)
diff --git a/lib/gdb_stacktrace.c b/lib/gdb_stacktrace.c
index 6e4dc29..b77898b 100644
--- a/lib/gdb_stacktrace.c
+++ b/lib/gdb_stacktrace.c
@@ -43,10 +43,11 @@ gdb_return_null(struct sr_stacktrace *stacktrace)
DEFINE_THREADS_FUNC(gdb_threads, struct sr_gdb_stacktrace)
DEFINE_SET_THREADS_FUNC(gdb_set_threads, struct sr_gdb_stacktrace)
+DEFINE_PARSE_WRAPPER_FUNC(gdb_parse, SR_REPORT_GDB)
struct stacktrace_methods gdb_stacktrace_methods =
{
- .parse = (parse_fn_t) stacktrace_parse_wrapper,
+ .parse = (parse_fn_t) gdb_parse,
.parse_location = (parse_location_fn_t) sr_gdb_stacktrace_parse,
.to_short_text = (to_short_text_fn_t) sr_gdb_stacktrace_to_short_text,
.to_json = (to_json_fn_t) gdb_return_null,
diff --git a/lib/generic_stacktrace.h b/lib/generic_stacktrace.h
index 2c1f56d..bb6ba9f 100644
--- a/lib/generic_stacktrace.h
+++ b/lib/generic_stacktrace.h
@@ -54,7 +54,14 @@ extern struct stacktrace_methods core_stacktrace_methods, python_stacktrace_meth
#define DEFINE_SET_THREADS_FUNC(name, concrete_t) \
DEFINE_SETTER(name, threads, struct sr_stacktrace, concrete_t, struct sr_thread)
-/* XXX generic functions */
+#define DEFINE_PARSE_WRAPPER_FUNC(name, type) \
+ static struct sr_stacktrace * \
+ name(const char **input, char **error_message) \
+ { \
+ return stacktrace_parse_wrapper(type, input, error_message); \
+ }
+
+/* generic functions */
struct sr_stacktrace *
stacktrace_parse_wrapper(enum sr_report_type type, const char **input, char **error_message);
@@ -63,6 +70,3 @@ stacktrace_to_short_text(struct sr_stacktrace *stacktrace, int max_frames);
struct sr_thread *
stacktrace_one_thread_only(struct sr_stacktrace *stacktrace);
-
-struct sr_stacktrace *
-stacktrace_parse_wrapper(enum sr_report_type type, const char **input, char **error_message);
diff --git a/lib/java_stacktrace.c b/lib/java_stacktrace.c
index 0a7b583..b3231e7 100644
--- a/lib/java_stacktrace.c
+++ b/lib/java_stacktrace.c
@@ -33,10 +33,11 @@
DEFINE_THREADS_FUNC(java_threads, struct sr_java_stacktrace)
DEFINE_SET_THREADS_FUNC(java_set_threads, struct sr_java_stacktrace)
+DEFINE_PARSE_WRAPPER_FUNC(java_parse, SR_REPORT_JAVA)
struct stacktrace_methods java_stacktrace_methods =
{
- .parse = (parse_fn_t) stacktrace_parse_wrapper,
+ .parse = (parse_fn_t) java_parse,
.parse_location = (parse_location_fn_t) sr_java_stacktrace_parse,
.to_short_text = (to_short_text_fn_t) stacktrace_to_short_text,
.to_json = (to_json_fn_t) sr_java_stacktrace_to_json,
diff --git a/lib/koops_stacktrace.c b/lib/koops_stacktrace.c
index 121c330..5ac3fdf 100644
--- a/lib/koops_stacktrace.c
+++ b/lib/koops_stacktrace.c
@@ -58,6 +58,7 @@ struct sr_taint_flag sr_flags[] = {
DEFINE_FRAMES_FUNC(koops_frames, struct sr_koops_stacktrace)
DEFINE_SET_FRAMES_FUNC(koops_set_frames, struct sr_koops_stacktrace)
+DEFINE_PARSE_WRAPPER_FUNC(koops_parse, SR_REPORT_KERNELOOPS)
struct thread_methods koops_thread_methods =
{
@@ -71,7 +72,7 @@ struct thread_methods koops_thread_methods =
struct stacktrace_methods koops_stacktrace_methods =
{
- .parse = (parse_fn_t) stacktrace_parse_wrapper,
+ .parse = (parse_fn_t) koops_parse,
.parse_location = (parse_location_fn_t) sr_koops_stacktrace_parse,
.to_short_text = (to_short_text_fn_t) stacktrace_to_short_text,
.to_json = (to_json_fn_t) sr_koops_stacktrace_to_json,
diff --git a/lib/python_stacktrace.c b/lib/python_stacktrace.c
index 89a090c..3c1d030 100644
--- a/lib/python_stacktrace.c
+++ b/lib/python_stacktrace.c
@@ -36,6 +36,7 @@
DEFINE_FRAMES_FUNC(python_frames, struct sr_python_stacktrace)
DEFINE_SET_FRAMES_FUNC(python_set_frames, struct sr_python_stacktrace)
+DEFINE_PARSE_WRAPPER_FUNC(python_parse, SR_REPORT_PYTHON)
struct thread_methods python_thread_methods =
{
@@ -49,7 +50,7 @@ struct thread_methods python_thread_methods =
struct stacktrace_methods python_stacktrace_methods =
{
- .parse = (parse_fn_t) stacktrace_parse_wrapper,
+ .parse = (parse_fn_t) python_parse,
.parse_location = (parse_location_fn_t) sr_python_stacktrace_parse,
.to_short_text = (to_short_text_fn_t) stacktrace_to_short_text,
.to_json = (to_json_fn_t) sr_python_stacktrace_to_json,
diff --git a/tests/java_stacktrace.at b/tests/java_stacktrace.at
index d38074c..be55703 100644
--- a/tests/java_stacktrace.at
+++ b/tests/java_stacktrace.at
@@ -80,6 +80,7 @@ AT_TESTFUN([sr_java_stacktrace_parse],
#include "java/thread.h"
#include "java/frame.h"
#include "location.h"
+#include "stacktrace.h"
#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
@@ -102,6 +103,19 @@ check(char *input,
{
assert(*input == '\0');
assert(0 == sr_java_stacktrace_cmp(stacktrace, expected_stacktrace));
+
+ /* check sr_stacktrace_parse */
+ char *error;
+ input = old_input;
+ struct sr_stacktrace *stacktrace2 = sr_stacktrace_parse(SR_REPORT_JAVA, &input, &error);
+ assert(stacktrace2);
+ char *json1 = sr_stacktrace_to_json(stacktrace);
+ char *json2 = sr_stacktrace_to_json(stacktrace2);
+ assert(json1 && json2 && 0 == strcmp(json1, json2));
+ free(json1);
+ free(json2);
+ sr_stacktrace_free(stacktrace2);
+
sr_java_stacktrace_free(stacktrace);
}
else
diff --git a/tests/koops_stacktrace.at b/tests/koops_stacktrace.at
index 86e694f..291b004 100644
--- a/tests/koops_stacktrace.at
+++ b/tests/koops_stacktrace.at
@@ -101,6 +101,7 @@ AT_TESTFUN([sr_koops_stacktrace_parse],
#include "location.h"
#include "utils.h"
#include "thread.h"
+#include "stacktrace.h"
#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
@@ -177,6 +178,22 @@ check(const char *path,
}
assert(actual_module_count == module_count);
+ /* test parsing via sr_stacktrace_parse */
+ input = full_input;
+ char *error;
+ struct sr_stacktrace *stacktrace2 = sr_stacktrace_parse(SR_REPORT_KERNELOOPS, &input, &error);
+
+ assert(stacktrace2);
+ reason = sr_stacktrace_get_reason(stacktrace);
+ reason2 = sr_stacktrace_get_reason(stacktrace2);
+
+ assert(reason && reason2);
+ assert(0 == strcmp(reason, reason2));
+
+ free(reason);
+ free(reason2);
+ sr_stacktrace_free(stacktrace2);
+
sr_koops_stacktrace_free(stacktrace);
free(full_input);
}
--
1.7.11.7
More information about the Crash-catcher
mailing list