|
From: Philippe W. <phi...@sk...> - 2017-06-21 20:28:29
|
On Wed, 2017-06-21 at 19:17 +0000, Mike Lui wrote:
> I posted this on the valgrind-dev mailing list a while back but didn't
> receive a response. Hopefully some users have some input.
>
>
> I'm working on a project that leverages Callgrind to generate VEX IR
> traces. I'm using Valgrind 3.12.0.
> I also use Callgrind's infrastructure to detect when Valgrind switches
> thread contexts, however I'm getting unexpected behavior.
>
>
> It looks like the best place to detect a thread context switch
> in Callgrind is in CLG_(setup_bbcc) in bbcc.c (line 561):
>
>
> /* This is needed because thread switches can not reliable be
> tracked
> * with callback CLG_(run_thread) only: we have otherwise no way to
> get
> * the thread ID after a signal handler returns.
> * This could be removed again if that bug is fixed in Valgrind.
> * This is in the hot path but hopefully not to costly.
> */
> tid = VG_(get_running_tid)();
> #if 1
> /* CLG_(switch_thread) is a no-op when tid is equal to
> CLG_(current_tid).
> * As this is on the hot path, we only call CLG_(switch_thread)(tid)
> * if tid differs from the CLG_(current_tid).
> */
> if (UNLIKELY(tid != CLG_(current_tid)))
> CLG_(switch_thread)(tid);
>
>
> The above is called every instrumented basic block.
> I've noticed strange behavior, where a thread switch would not always
> be detected.
> I detected the unexpected behavior with the following modifications:
>
>
> To investigate further, I modified the above:
> - if (UNLIKELY(tid != CLG_(current_tid)))
>
> + if (UNLIKELY(tid != CLG_(current_tid))) {
> CLG_(switch_thread)(tid);
> + VG_(printf)("Thread switched to: %d\n", tid);
> + }
>
Adding --trace-sched=yes might help to understand what happens.
Also, --trace-signals=yes might be useful if the problem is signal
related.
Philippe
|