假设我有一个没有源的通用二进制文件,我想确定它是串行运行还是产生多个线程。
有没有办法可以从 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
输出的每一行对应一个线程。当然,这仅适用于某个特定时刻。按照 Jonathon Reinhart 的建议,要跟踪线程的产生,请使用 strace。
strace
当然,替代方案是gdb
. 有关在 gdb 中管理线程的详细信息,请参阅此问题。您还可以阅读 gdb 手册的线程部分。快速介绍:
$ gdb /usr/lib/firefox/firefox <pid>
[... initialization output ...]
> info threads # lists threads
> thread <nr> # switch to thread <nr>
你的评论:
如果程序只需要几秒钟的时间运行,我如何确定在哪里设置指令级断点?
这个答案可能会对您有所帮助,因为它显示了如何pthread_create
使用 gdb 中断线程创建(使用 )。因此,每次创建线程时,执行都会停止,您可能会进行调查。
首先安装strace
.
$ yum install strace
使用 strace 运行程序,并查找clone
或fork
系统调用。这是一个我编写的仅调用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 +++
Just run:cat /proc/<pid>/stat | awk '{print $20}'
获取正在运行的进程的线程数。