如何判断Linux二进制文件在没有源代码的情况下创建了多少个线程?

时间:2013-05-16 20:43:50

标签: c linux multithreading

假设我有一个没有源的通用二进制文件,我想确定它是串行运行还是生成多个线程。

有没有办法可以从linux命令行执行此操作?

3 个答案:

答案 0 :(得分:4)

首先安装strace

$ yum install strace

使用strace运行程序,并查找clonefork系统调用。这是我编写的程序的一个简单示例,它只调用fork并返回。

$ strace ./a.out 

execve("./a.out", ["./a.out"], [/* 43 vars */]) = 0
brk(0)                                  = 0x74f000
...
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fb22b16da10) = 6567
exit_group(1)                           = ?
+++ exited with 1 +++

答案 1 :(得分:4)

您可以使用ps。来自man ps

-L     Show threads, possibly with LWP and NLWP columns.

所以你可以这样做:

$ ps -L <pid>

它会告诉你这样的事情:

 PID   LWP TTY      STAT   TIME COMMAND
4112  4112 ?        Sl    65:35 /usr/lib/firefox/firefox
4112  4116 ?        Sl     0:04 /usr/lib/firefox/firefox

输出的每一行对应一个线程。这当然只适用于某种情况 这一刻。要跟踪线程的产生,请按照Jonathon Reinhart的建议使用strace。

strace的替代方案当然是gdb。有关在gdb中管理线程的详细信息,请参阅this question。您还可以阅读gdb手册的thread section。快速介绍:

$ gdb /usr/lib/firefox/firefox <pid>
[... initialization output ...]
> info threads    # lists threads
> thread <nr>     # switch to thread <nr>

您的评论:

  

如果程序只需要几秒钟才能运行,我怎样才能找出设置指令级断点的位置?

This answer可能会对您有所帮助,因为它显示了如何使用gdb打破线程创建(使用pthread_create)。因此,每次创建一个线程时,执行都会停止,您可能会进行调查。

答案 2 :(得分:1)

只需运行:cat /proc/<pid>/stat | awk '{print $20}'即可获得正在运行的进程的线程数。

proc manpage