将线程id从顶部映射到gdb

时间:2011-10-03 09:18:29

标签: multithreading gdb

我使用top来使用

查看线程明智的cpu使用情况
  top -H -p `pgrep app.out`

它显示了每个线程的一些pid,如

4015
4016

我使用gdb attach命令将gdb附加到应用程序。 现在我想切换到显示在顶部o / p内部的线程4015。

我该怎么做?

如果我触发线程4015,它显示没有线程。因为我需要在gdb中提供线程ID。

那么如何将顶级线程id映射到gdb线程id?

2 个答案:

答案 0 :(得分:5)

您应该能够将GDB中显示的LWPtop信息进行匹配:

根据我在Firefox上的快速测试,您可以在top -H -p

中看到
PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
6492 kevin     20   0 1242m 386m  31m S  0.3  4.9   0:09.00 firefox
6470 kevin     20   0 1242m 386m  31m S  5.7  4.9   5:04.89 firefox

以及GDB中的info threads

 22   Thread 0x7fe3d2393700 (LWP 6492) "firefox" pthread_cond_timedwait...
...
* 1   Thread 0x7fe3dd868740 (LWP 6470) "firefox" __GI___poll ()...

编辑:专属于您,这是gdb的全新命令:lwp_to_id <lwp>

import gdb
class lwp_to_id (gdb.Command):
    def __init__(self):
        gdb.Command.__init__(self, "lwp_to_id", gdb.COMMAND_OBSCURE)

    def invoke(self, args, from_tty):
        lwp = int(args)
        for thr in gdb.selected_inferior().threads():
            if thr.ptid[1] == lwp:
                print "LWP %s maps to thread #%d" % (lwp, thr.num)
                return
        else:
            print "LWP %s doesn't match any threads in the current inferior." % lwp
lwp_to_id()

(至少在GDB的trunk版本上工作,不确定官方版本!

答案 1 :(得分:1)

做一个

ps xjf 

这将为您提供包含其pid和父pid的所有进程的树。