5

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

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

4

3 回答 3

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 中管理线程的详细信息,请参阅此问题。您还可以阅读 gdb 手册的线程部分。快速介绍:

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

你的评论:

如果程序只需要几秒钟的时间运行,我如何确定在哪里设置指令级断点?

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

于 2013-05-17T00:41:02.767 回答
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 +++
于 2013-05-16T20:50:56.483 回答
1

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

proc 手册页

于 2013-05-17T13:04:18.820 回答