04910c3b6f14d0542b9a21896a4e96f497de4596 |
|
18-May-2014 |
philippe <philippe@a5019735-40e9-0310-863c-91ae7b9d1cf9> |
on ppc64, pthread_create_WRK is not (always) produced in the stacktrace showing where a thread was created. This makes many tests fail => use sed to delete pthread_create_WRK from the stacktrace to let tests succeed on ppc64. With this change, on ppc64 gcc110 (fedora 18), helgrind failures goes from 28 tests failing to 4, with following reasons: helgrind/tests/pth_cond_destroy_busy (stderr) (6 errors instead of 3 in the summary line ???) helgrind/tests/tc06_two_races_xml (stderr) similar change needed in filter_xml to del pthread_create_WRK helgrind/tests/tc18_semabuse (stderr) - with error code 22 (EINVAL: Invalid argument) + with error code 38 (ENOSYS: Function not implemented) helgrind/tests/tc20_verifywrap (stderr) - with error code 22 (EINVAL: Invalid argument) + with error code 38 (ENOSYS: Function not implemented) More details about the stacktrace not containing pthread_create_WRK: -------------------------------------------------------------------- Here is the stacktrace obtained by GDB+vgdb: (gdb) bt #0 0x0000008074f7ac5c in .__clone () from /lib64/libc.so.6 #1 0x000000807517b1ec in do_clone (pd=0x4c6f200, attr=0x8075189c90 <default_attr>, stackaddr=<optimized out>, stopped=<optimized out>, fct=@0x80751a01e0: 0x807517c500 <start_thread>, clone_flags=4001536) at ../nptl/sysdeps/pthread/createthread.c:74 #2 0x000000000403ed0c in pthread_create_WRK (thread=<error reading variable: value has been optimized out>, attr=<error reading variable: value has been optimized out>, start=<error reading variable: value has been optimized out>, arg=0xfff00ee18) at hg_intercepts.c:269 #3 0x000000000403ef1c in _vgw00000ZZ_libpthreadZdsoZd0_pthreadZucreateZAZa (thread=<optimized out>, attr=<optimized out>, start=<optimized out>, arg=<optimized out>) at hg_intercepts.c:300 #4 0x000000003806f1d8 in ?? () #5 0x0000008074e9fb94 in generic_start_main (main=@0x100200d8: 0x100013a0 <main>, argc=<optimized out>, ubp_av=0xfff00f2d8, auxvec=0xfff00f408, init=<optimized out>, rtld_fini=<optimized out>, stack_end=<optimized out>, fini=<optimized out>) at ../csu/libc-start.c:225 #6 0x0000008074e9fd90 in __libc_start_main (argc=<optimized out>, ubp_av=<optimized out>, ubp_ev=<optimized out>, auxvec=<optimized out>, rtld_fini=<optimized out>, stinfo=<optimized out>, stack_on_entry=<optimized out>) at ../sysdeps/unix/sysv/linux/powerpc/libc-start.c:91 #7 0x0000000000000000 in ?? () (gdb) and here is the stacktrace produced by Valgrind unwinder: Thread 1: status = VgTs_Runnable ==41687== at 0x8074F7AC5C: clone (in /usr/lib64/libc-2.16.so) ==41687== by 0x807517B1EB: do_clone.constprop.3 (createthread.c:74) ==41687== by 0x403EF1B: pthread_create@* (hg_intercepts.c:300) ==41687== by 0x10001597: main (tc19_shadowmem.c:172) valgrind stack top usage: 15328 of 1048576 When the 2nd clone break is encountered (in the child thread), here is the GDB stacktraces: Thread 2 (Thread 6028): #0 0x0000008074f75fb0 in .madvise () from /lib64/libc.so.6 #1 0x000000807517c700 in start_thread (arg=0x4c6f200) at pthread_create.c:402 #2 0x0000008074f7acf0 in .__clone () from /lib64/libc.so.6 Thread 1 (Thread 41687): #0 pthread_create_WRK (thread=0xfff00ee10, attr=0x0, start=@0x100200e8: 0x10001dd0 <steer>, arg=0xfff00ee18) at hg_intercepts.c:248 #1 0x000000000403ef1c in _vgw00000ZZ_libpthreadZdsoZd0_pthreadZucreateZAZa (thread=<optimized out>, attr=<optimized out>, start=<optimized out>, arg=<optimized out>) at hg_intercepts.c:300 #2 0x000000003806f1d8 in ?? () #3 0x0000008074e9fb94 in generic_start_main (main=@0x100200d8: 0x100013a0 <main>, argc=<optimized out>, ubp_av=0xfff00f2d8, auxvec=0xfff00f408, init=<optimized out>, rtld_fini=<optimized out>, stack_end=<optimized out>, fini=<optimized out>) at ../csu/libc-start.c:225 #4 0x0000008074e9fd90 in __libc_start_main (argc=<optimized out>, ubp_av=<optimized out>, ubp_ev=<optimized out>, auxvec=<optimized out>, rtld_fini=<optimized out>, stinfo=<optimized out>, stack_on_entry=<optimized out>) at ../sysdeps/unix/sysv/linux/powerpc/libc-start.c:91 #5 0x0000000000000000 in ?? () (gdb) Here are the valgrind stacktraces: Thread 1: status = VgTs_Runnable ==41687== at 0x403EBE0: pthread_create_WRK (hg_intercepts.c:248) ==41687== by 0x403EF1B: pthread_create@* (hg_intercepts.c:300) ==41687== by 0x8074E9FB93: generic_start_main.isra.0 (libc-start.c:225) ==41687== by 0x8074E9FD8F: (below main) (libc-start.c:91) valgrind stack top usage: 15328 of 1048576 Thread 2: status = VgTs_WaitSys ==41687== at 0x8074F75FB0: madvise (in /usr/lib64/libc-2.16.so) ==41687== by 0x807517C6FF: start_thread (pthread_create.c:402) valgrind stack top usage: 10320 of 1048576 And then after a few more next/breaks: Thread 1: status = VgTs_Runnable ==41687== at 0x8074F7AC5C: clone (in /usr/lib64/libc-2.16.so) ==41687== by 0x807517B1EB: do_clone.constprop.3 (createthread.c:74) ==41687== by 0x403EF1B: pthread_create@* (hg_intercepts.c:300) ==41687== by 0x100015BB: main (tc19_shadowmem.c:173) valgrind stack top usage: 15328 of 1048576 Thread 2: status = VgTs_WaitSys ==41687== at 0x8074F75FB0: madvise (in /usr/lib64/libc-2.16.so) ==41687== by 0x807517C6FF: start_thread (pthread_create.c:402) valgrind stack top usage: 10320 of 1048576 So, pthread_create_WRK is not in the stacktrace anymore. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@13983 a5019735-40e9-0310-863c-91ae7b9d1cf9
/external/valgrind/helgrind/tests/tc21_pthonce.stderr.exp
|
07c08527f05caeb0062b42ca9a58ee774ec5fba1 |
|
14-May-2014 |
philippe <philippe@a5019735-40e9-0310-863c-91ae7b9d1cf9> |
Factorises the address code description and printing of memcheck and helgrind in a common module: pub_tool_addrinfo.h pub_core_addrinfo.h m_addrinfo.c At the same time, the factorised code is made usable by other tools also (and is used by the gdbserver command 'v.info location' which replaces the helgrind 'describe addr' introduced 1 week ago and which is now callable by all tools). The new address description code can describe more addresses (e.g. for memcheck, if the block is not on the free list anymore, but is in an arena free list, this will also be described). Similarly, helgrind address description can now describe more addresses when --read-var-info=no is given (e.g. global symbols are described, or addresses on the stack are described as being on the stack, freed blocks in the arena free list are described, ...). See e.g. the change in helgrind/tests/annotate_rwlock.stderr.exp or locked_vs_unlocked2.stderr.exp The patch touches many files, but is basically a lot of improvements in helgrind output files. The code changes are mostly refactorisation of existing code. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@13965 a5019735-40e9-0310-863c-91ae7b9d1cf9
/external/valgrind/helgrind/tests/tc21_pthonce.stderr.exp
|
6ef137ef2ce97574decf190c5bad222056f3dbe9 |
|
06-Dec-2013 |
dejanj <dejanj@a5019735-40e9-0310-863c-91ae7b9d1cf9> |
mips32/mips64: Suppress race condition error. On MIPS architecture helgrind is showing race condition error in printf if the printf is first time called from the child thread. If we call printf from the main for the first time we will suppress this error on mips. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@13749 a5019735-40e9-0310-863c-91ae7b9d1cf9
/external/valgrind/helgrind/tests/tc21_pthonce.stderr.exp
|
81d24c396c66dde7db2d9b567451f99081a2eab7 |
|
05-Dec-2012 |
philippe <philippe@a5019735-40e9-0310-863c-91ae7b9d1cf9> |
fix 310424 --read-var-info does not properly describe static variables This patch changes the way static variables are recorded by readdwarf3.c (when giving --read-var-info=yes), improving the way such variables are described. Currently: A static variable does not have the DW_AT_external tag. So, readdwarf3.c does not consider it a global variable. It is rather considered a "local" variable. When it is recorded, it is associated to a range of program counters (the functions in the file where it is visible). However, even if the static variable is only visible in the source file where it is declared, it can in reality be used by any range of program counters, typically by having the address of the local variable passed to other functions. Such local variable can then only be described when the program counter is in the range of program counters for which it has been recorded. However, this (local) description is obtained by a kludge in debuginfo.c (around line 3285). This kludge then produces a strange description, telling that the variable has been declared in frame 0 of a thread (see second example below). The kludge is not always able to describe the address (if the IP of the tid is in another file than where the variable has been declared). I suspect the kludge can sometimes describe the var as being declared in an unrelated thread (e.g. if an error is triggered by tid 5, but tid1 is by luck in an IP corresponding to the recorded range). The patch changes the way a static variable is recorded: if DW_AT_external tag is found, a variable is marked as global. If a variable is not external, but is seen when level is 1, then we record the variable as a global variable (i.e. with a full IP range). This improves the way such static variable are described: * they are described even if being accessed by other files. * their description is not in an artificial "thread frame". First example: ************** a variable cannot be described because it is accessed by a function in another file: with the trunk: ==20410== ---------------------------------------------------------------- ==20410== ==20410== Possible data race during read of size 4 at 0x600F54 by thread #1 ==20410== Locks held: none ==20410== at 0x4007E4: a (abc.c:42) ==20410== by 0x4006BC: main (mabc.c:24) ==20410== ==20410== This conflicts with a previous write of size 4 by thread #2 ==20410== Locks held: none ==20410== at 0x4007ED: a (abc.c:42) ==20410== by 0x400651: brussels_fn (mabc.c:9) ==20410== by 0x4C2B54E: mythread_wrapper (hg_intercepts.c:219) ==20410== by 0x4E348C9: start_thread (pthread_create.c:300) ==20410== ==20410== ---------------------------------------------------------------- with the patch: ==4515== ---------------------------------------------------------------- ==4515== ==4515== Possible data race during read of size 4 at 0x600F54 by thread #1 ==4515== Locks held: none ==4515== at 0x4007E4: a (abc.c:42) ==4515== by 0x4006BC: main (mabc.c:24) ==4515== ==4515== This conflicts with a previous write of size 4 by thread #2 ==4515== Locks held: none ==4515== at 0x4007ED: a (abc.c:42) ==4515== by 0x400651: brussels_fn (mabc.c:9) ==4515== by 0x4C2B54E: mythread_wrapper (hg_intercepts.c:219) ==4515== by 0x4E348C9: start_thread (pthread_create.c:300) ==4515== ==4515== Location 0x600f54 is 0 bytes inside global var "static_global" ==4515== declared at mabc.c:4 ==4515== ==4515== ---------------------------------------------------------------- Second example: *************** When the kludge can describe the variable, it is strangely described as being declared in a frame of a thread, while for sure the declaration has nothing to do with a thread With the trunk: ==20410== Location 0x600f68 is 0 bytes inside local var "static_global_a" ==20410== declared at abc.c:3, in frame #0 of thread 1 With the patch: ==4515== Location 0x600f68 is 0 bytes inside global var "static_global_a" ==4515== declared at abc.c:3 #include <stdio.h> static int static_global_a = 0; //// <<<< this is abc.c:3 git-svn-id: svn://svn.valgrind.org/valgrind/trunk@13153 a5019735-40e9-0310-863c-91ae7b9d1cf9
/external/valgrind/helgrind/tests/tc21_pthonce.stderr.exp
|
31014dae410799bfb128af2d396ee70374fa4b75 |
|
26-Sep-2011 |
florian <florian@a5019735-40e9-0310-863c-91ae7b9d1cf9> |
Change the backtrace filtering machinery for the helgrind regression bucket. Instead of removing what we don't want to see in a backtrace (e.g. path segments through libc and libpthread), we simply keep what we do want to see. That way .exp files can be generic. We need to make sure that GCC inlining does not get in the way. So all the ..._WRK function in hg_intercepts.c are attributed as noinline. The backtrace filtering is done in the new filter_helgrind script. filter_stderr is simplified quite a bit. Fixes bug #281468. See also the comments #5 and #6 there. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@12045 a5019735-40e9-0310-863c-91ae7b9d1cf9
/external/valgrind/helgrind/tests/tc21_pthonce.stderr.exp
|
9af8d1e21468cbacdefc437b312ba1fa95fcba16 |
|
24-Jun-2011 |
sewardj <sewardj@a5019735-40e9-0310-863c-91ae7b9d1cf9> |
Fix a bunch of helgrind .stderr.exp-s following r11824 (merge of branches/HGDEV2) git-svn-id: svn://svn.valgrind.org/valgrind/trunk@11825 a5019735-40e9-0310-863c-91ae7b9d1cf9
/external/valgrind/helgrind/tests/tc21_pthonce.stderr.exp
|
cab64bca3a865a294b2c20f158c8c2182fa4eb7e |
|
12-Aug-2009 |
njn <njn@a5019735-40e9-0310-863c-91ae7b9d1cf9> |
Update .exp files for r10783. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@10784 a5019735-40e9-0310-863c-91ae7b9d1cf9
/external/valgrind/helgrind/tests/tc21_pthonce.stderr.exp
|
553c42fad6eeae28d751806ff9c2803c41e80310 |
|
13-Mar-2009 |
njn <njn@a5019735-40e9-0310-863c-91ae7b9d1cf9> |
Added better filtering for Helgrind tests, removing all unreliable stack traces, and a few other unreliable pieces. This allowed most of the tests to be reduced to a single .stderr.exp file. It also means that all Helgrind tests succeed on my AMD64/Linux box when configured with --enable-only32bit, whereas previously 20 of them failed. Also tweaked a couple non-Helgrind filters a tiny bit. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@9389 a5019735-40e9-0310-863c-91ae7b9d1cf9
/external/valgrind/helgrind/tests/tc21_pthonce.stderr.exp
|