lldb / Xcode:如何打印线程索引,id或名称?

时间:2014-09-29 11:56:05

标签: c++ objective-c xcode lldb

问题:我想在Xcode中使用断点帮助跟踪程序,所以我感兴趣的是我的函数总是在一个线程中执行。

有一本手册:http://lldb.llvm.org/formats.html,它包含所有必需的变量,但由于某些原因它们不适用于p / expr命令。

所以我想要一些像p $ {thread.id}或expr - thread.id这样的东西,但我对它们没有好运。

我知道的方法很糟糕:

  

p / x(长)pthread_self()

并获取名称:

  

p new char [256] //它将返回合适的指针,如$ 3 = 0x000000007480840

     

p(int)pthread_getname_np((pthread_t)yourId,$ 3,(size_t)256)//它将线程名写入缓冲区

     

p $ 3 //你会看到它的名字

     

如果您担心内存泄漏,请删除$ 3 //

但它似乎是一个糟糕的解决方法,并不适合断点。

1 个答案:

答案 0 :(得分:3)

" formats.html"中提到的格式页面不用于表达式,而是用于lldb打印时打印线程和帧信息的方式。例如,我有这个:

    settings set thread-format thread #${thread.index}: tid = ${thread.id}{, name = ${thread.name}}{, function: ${function.name}} {, stop reason = ${thread.stop-reason}}{, return = ${thread.return-value}}\n

在我的.lldbinit中,所以我可以看到线程ID&我停下来的名字。

如果您在Xcode中运行,您通常不会在停止时看到打印的线程信息,因为Xcode不会将每个停靠点回显到Xcode控制台。但你仍然可以通过"线程信息"来调用这些信息。命令:

    (lldb) thread info
    thread #1: tid = 0x34ca69, name = A_Cool_Thread, function: -[SKTGraphicView alignLeftEdges:] , stop reason = breakpoint 2.1

因此,出于您的目的,您可以在您关心的断点上放置断点命令,并使命令为" thread info"。然后每个站点都会显示ID和名称等。

注意,另一种做同样事情的方法是使用Python断点命令,例如:

(lldb) breakpoint command add -s python <BPNO>
Enter your Python command(s). Type 'DONE' to end.
def function (frame, bp_loc, internal_dict):
    """frame: the lldb.SBFrame for the location at which you stopped
       bp_loc: an lldb.SBBreakpointLocation for the breakpoint location information
       internal_dict: an LLDB support object not to be used"""
    print "Thread ID is: ", frame.thread.GetThreadID(), " and name: ", frame.thread.GetName() 
    DONE
(lldb)

然后每当你遇到断点时,你会看到类似的东西:

Thread id is:  3459689  and name:  A_Cool_Thread
顺便说一句,您没有说出您所使用的系统,但在Mac OS X上,此处列出的线程ID不是pthread ID。 pthread id只保证对于程序中给定时间存在的所有线程都是唯一的,因此虽然程序中给定时间的每个线程都有不同的pthread ID,但是没有保证不同时间的两个线程具有不同的pthread ID。 Mac OS X具有全局唯一的线程ID&#34;但是,它在程序的运行过程中是唯一的。那个线程ID是什么。