假设我有一个没有源的通用二进制文件,我想确定它是连续运行还是产生多个线程。
有没有办法,我可以做到这一点从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运行程序,并查找clone
或fork
系统调用。 下面是我写的一个程序的简单例子,它只是调用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手册页