summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKarel Klic <kklic@redhat.com>2011-02-04 15:11:04 +0100
committerKarel Klic <kklic@redhat.com>2011-02-04 15:11:04 +0100
commit7ae7e83314e449f5d7f69be41f1498bf33340d1b (patch)
tree683e46da30f96e8d598085df3387a64272c0b253 /src
parent236f571db5ec6d0f05891373f518b6d87cedebbe (diff)
downloadabrt-7ae7e83314e449f5d7f69be41f1498bf33340d1b.tar.gz
abrt-7ae7e83314e449f5d7f69be41f1498bf33340d1b.tar.xz
abrt-7ae7e83314e449f5d7f69be41f1498bf33340d1b.zip
btparser: Better normalization of glibc architecture-specific functions.
btparser: New supported format of thread header: "Thread 8 (LWP 6357):"
Diffstat (limited to 'src')
-rw-r--r--src/btparser/normalize_glibc.c14
-rw-r--r--src/btparser/thread.c82
-rw-r--r--src/btparser/thread.h11
3 files changed, 66 insertions, 41 deletions
diff --git a/src/btparser/normalize_glibc.c b/src/btparser/normalize_glibc.c
index 3a2dbcf7..3d0bca2b 100644
--- a/src/btparser/normalize_glibc.c
+++ b/src/btparser/normalize_glibc.c
@@ -71,9 +71,12 @@ btp_normalize_glibc_thread(struct btp_thread *thread)
/* Normalize frame names. */
#define NORMALIZE_ARCH_SPECIFIC(func) \
- if (btp_frame_calls_func_in_file2(frame, "__" func "_sse2", func ".S", "libc.so") || \
- btp_frame_calls_func_in_file2(frame, "__" func "_ssse3", func ".S", "libc.so") || \
- btp_frame_calls_func_in_file2(frame, "__" func "_ia32", func ".S", "libc.so")) \
+ if (btp_frame_calls_func_in_file3(frame, "__" func "_sse2", func, "/sysdeps/", "libc.so") || \
+ btp_frame_calls_func_in_file3(frame, "__" func "_sse2_bsf", func, "/sysdeps/", "libc.so") || \
+ btp_frame_calls_func_in_file3(frame, "__" func "_ssse3", func, "/sysdeps/", "libc.so") /* ssse3, not sse3! */ || \
+ btp_frame_calls_func_in_file3(frame, "__" func "_ssse3_rep", func, "/sysdeps/", "libc.so") || \
+ btp_frame_calls_func_in_file3(frame, "__" func "_sse42", func, "/sysdeps/", "libc.so") || \
+ btp_frame_calls_func_in_file3(frame, "__" func "_ia32", func, "/sysdeps", "libc.so")) \
{ \
strcpy(frame->function_name, func); \
}
@@ -81,8 +84,11 @@ btp_normalize_glibc_thread(struct btp_thread *thread)
NORMALIZE_ARCH_SPECIFIC("memchr");
NORMALIZE_ARCH_SPECIFIC("memcmp");
NORMALIZE_ARCH_SPECIFIC("memcpy");
+ NORMALIZE_ARCH_SPECIFIC("memmove");
NORMALIZE_ARCH_SPECIFIC("memset");
NORMALIZE_ARCH_SPECIFIC("rawmemchr");
+ NORMALIZE_ARCH_SPECIFIC("strcasecmp");
+ NORMALIZE_ARCH_SPECIFIC("strcasecmp_l");
NORMALIZE_ARCH_SPECIFIC("strcat");
NORMALIZE_ARCH_SPECIFIC("strchr");
NORMALIZE_ARCH_SPECIFIC("strchrnul");
@@ -91,9 +97,11 @@ btp_normalize_glibc_thread(struct btp_thread *thread)
NORMALIZE_ARCH_SPECIFIC("strcspn");
NORMALIZE_ARCH_SPECIFIC("strlen");
NORMALIZE_ARCH_SPECIFIC("strncmp");
+ NORMALIZE_ARCH_SPECIFIC("strncpy");
NORMALIZE_ARCH_SPECIFIC("strpbrk");
NORMALIZE_ARCH_SPECIFIC("strrchr");
NORMALIZE_ARCH_SPECIFIC("strspn");
+ NORMALIZE_ARCH_SPECIFIC("strstr");
NORMALIZE_ARCH_SPECIFIC("strtok");
/* Remove frames which are not a cause of the crash. */
diff --git a/src/btparser/thread.c b/src/btparser/thread.c
index 4d52a9d4..05f154d6 100644
--- a/src/btparser/thread.c
+++ b/src/btparser/thread.c
@@ -293,7 +293,7 @@ btp_thread_parse(char **input,
return NULL;
}
- /* Skip spaces after the thread number and before the parenthesis. */
+ /* Skip spaces after the thread number and before parentheses. */
spaces = btp_skip_char_sequence(&local_input, ' ');
location->column += spaces;
if (0 == spaces)
@@ -303,60 +303,49 @@ btp_thread_parse(char **input,
return NULL;
}
- /* Read the Thread keyword in parenthesis, which is mandatory. */
+ /* Read the LWP section in parentheses, optional. */
+ location->column += btp_thread_skip_lwp(&local_input);
+
+ /* Read the Thread keyword in parentheses, optional. */
chars = btp_skip_string(&local_input, "(Thread ");
location->column += chars;
- if (0 == chars)
- {
- location->message = "Thread keyword in the parenthesis expected in the form '(Thread '.";
- btp_thread_free(imthread);
- return NULL;
- }
-
- /* Read the thread identification number. It can be either in
- * decimal or hexadecimal form.
- * Examples:
- * "Thread 10 (Thread 2476):"
- * "Thread 8 (Thread 0xb07fdb70 (LWP 6357)):"
- */
- digits = btp_skip_hexadecimal_number(&local_input);
- if (0 == digits)
- digits = btp_skip_unsigned_integer(&local_input);
- location->column += digits;
- if (0 == digits)
+ if (0 != chars)
{
- location->message = "The thread identification number expected.";
- btp_thread_free(imthread);
- return NULL;
- }
-
- /* Handle the optional " (LWP [0-9]+)" section. */
- chars = btp_skip_string(&local_input, " (LWP ");
- if (0 < chars)
- {
- location->column += chars;
- digits = btp_skip_unsigned_integer(&local_input);
+ /* Read the thread identification number. It can be either in
+ * decimal or hexadecimal form.
+ * Examples:
+ * "Thread 10 (Thread 2476):"
+ * "Thread 8 (Thread 0xb07fdb70 (LWP 6357)):"
+ */
+ digits = btp_skip_hexadecimal_number(&local_input);
+ if (0 == digits)
+ digits = btp_skip_unsigned_integer(&local_input);
+ location->column += digits;
if (0 == digits)
{
- location->message = "The LWP number expected.";
+ location->message = "The thread identification number expected.";
btp_thread_free(imthread);
return NULL;
}
- location->column += digits;
+
+ /* Handle the optional " (LWP [0-9]+)" section. */
+ location->column += btp_skip_char_sequence(&local_input, ' ');
+ location->column += btp_thread_skip_lwp(&local_input);
+
+ /* Read the end of the parenthesis. */
if (!btp_skip_char(&local_input, ')'))
{
- location->message = "Closing parenthesis for LWP expected.";
+ location->message = "Closing parenthesis for Thread expected.";
btp_thread_free(imthread);
return NULL;
}
- location->column += 1;
}
- /* Read the end of the parenthesis. */
- chars = btp_skip_string(&local_input, "):\n");
+ /* Read the end of the header line. */
+ chars = btp_skip_string(&local_input, ":\n");
if (0 == chars)
{
- location->message = "The end of the parenthesis expected in the form of '):\\n'.";
+ location->message = "Expected a colon followed by a newline ':\\n'.";
btp_thread_free(imthread);
return NULL;
}
@@ -391,3 +380,20 @@ btp_thread_parse(char **input,
*input = local_input;
return imthread;
}
+
+int
+btp_thread_skip_lwp(char **input)
+{
+ char *local_input = *input;
+ int count = btp_skip_string(&local_input, "(LWP ");
+ if (0 == count)
+ return 0;
+ int digits = btp_skip_unsigned_integer(&local_input);
+ if (0 == digits)
+ return 0;
+ count += digits;
+ if (!btp_skip_char(&local_input, ')'))
+ return 0;
+ *input = local_input;
+ return count + 1;
+}
diff --git a/src/btparser/thread.h b/src/btparser/thread.h
index f7287385..47a0211b 100644
--- a/src/btparser/thread.h
+++ b/src/btparser/thread.h
@@ -197,6 +197,17 @@ struct btp_thread *
btp_thread_parse(char **input,
struct btp_location *location);
+/**
+ * If the input contains a LWP section in form of "(LWP [0-9]+), move
+ * the input pointer after this section. Otherwise do not modify
+ * input.
+ * @returns
+ * The number of characters parsed from input. 0 if the input does not
+ * contain a LWP section.
+ */
+int
+btp_thread_skip_lwp(char **input);
+
#ifdef __cplusplus
}
#endif