I analyzed the problem to be the following. Linux uses periodic SIGPROF signals
for profiling (Linux doesn't use the profil system call used in other OS's like
Solaris where the kernel does the profiling on behalf of the process). All
profile information is collected in the context of the signal handler for the
SIGPROF signal in Linux. Unfortunately, any thread that's created using
pthread_create() does not get these periodic SIGPROF signals. Hence any thread
other than the first thread is not profiled. The fix is to use setitimer()
system call immediately in the thread startup function for any new thread to
make the SIGPROF signal to be delivered at the designated interrupt frequency
(every 10ms). With this fix, the profile produced by gprof reflects the overall
computation done by all threads in the process. A more general fix would be
to fix the kernel to make any new threads inherit the setitimer() settings
for the parent thread.
Does anyone know if this problem has already been fixed ? If so, please send me
a pointer to the patch. Thanks,
- Mohit
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/