From 7ae7e83314e449f5d7f69be41f1498bf33340d1b Mon Sep 17 00:00:00 2001 From: Karel Klic Date: Fri, 4 Feb 2011 15:11:04 +0100 Subject: btparser: Better normalization of glibc architecture-specific functions. btparser: New supported format of thread header: "Thread 8 (LWP 6357):" --- src/btparser/normalize_glibc.c | 14 ++++++-- src/btparser/thread.c | 82 ++++++++++++++++++++++-------------------- src/btparser/thread.h | 11 ++++++ 3 files changed, 66 insertions(+), 41 deletions(-) (limited to 'src') 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 -- cgit