Date: Fri, 26 Sep 2008 12:06:58 -0700 From: Dilip Chhetri <dchhetri@panasas.com> To: freebsd-threads@freebsd.org Subject: getting stack trace for other thread on the same process : libthr Message-ID: <48DD32D2.2060304@panasas.com>
next in thread | raw e-mail | index | archive | help
Question -------- My program is linked with libthr in FreeBSD-7.0. The program has in the order of 20 threads, and a designated monitoring thread at some point wants to know what are other/stuck threads doing. This needs to be done by printing stack backtrace for the thread to stdout. I understand pthread_t structure has pointer to the target thread's stack, but to get the trace I need to know value of stack-pointer register and base-pointer register. I looked at the code and I don't find any mechanism by which I could read the target threads register context (because it all resides within kernel thread structure). Further code study reveals that kernel_thread->td_frame contains the register context for a thread, but is valid only when the thread is executing/sleeping inside the kernel. Is there anything I'm missing here ? Is there an easy way to traverse stack for some thread with in the same process. I considered/considering following approaches, a) use PTRACE ruled out, because you can't trace the process from within the same process b) somehow temporarily stop the target-thread and read td_frame by traversing kernel data structure through /dev/kmem. After doing stack traversal resume the target thread. Detailed problem background -------------------------- We have this process X with ~20 threads, each processing some requests. One of them is designated as monitoring/dispatcher thread. When a new request arrives, dispatcher thread tries to queue the task to idle thread. But if all threads are busy processing requests, the dispatcher thread is supposed to print the stack back trace for each of the busy thread. This is our *debugging* mechanism to find potential fault-points. In FreeBSD-4.6.2, we hacked libc_r:pthread_t to achieve our goal. But in FreeBSD-7.0, we decided to use libthr and hack doesn't seem to be easy. Target setup ------------ * SMP : around 8 CPU * process : it's going to be run as root and have around ~20 threads
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?48DD32D2.2060304>