如何知道Linux二进制文件在没有源代码的情况下创build了多less个线程?

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

有没有办法,我可以做到这一点从Linux的命令行?

你可以使用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 

输出的每一行对应于一个线程。 这当然只适用于某一时刻。 为了跟踪线程的产生,使用strace,如Jonathon Reinhart所建议的。

当然, strace的替代方案是gdb 。 有关在gdb中管理线程的详细信息,请参阅此问题 。 您也可以阅读gdb手册的主题部分 。 快速介绍:

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

你的评论:

如果程序只需要几秒钟的时间,我怎么才能找出在哪里设置指令级别的断点呢?

这个答案可能会帮助你,因为它显示了如何使用gdb来断开线程创建(使用pthread_create )。 所以每当一个线程被创建,执行停止,你可能会调查。

首先安装strace

 $ yum install strace 

使用strace运行程序,并查找clonefork系统调用。 下面是我写的一个程序的简单例子,它只是调用fork和return。

 $ 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 +++ 

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

proc手册页