Проблема: я хочу отслеживать программу с помощью точек останова с действием в Xcode, поэтому меня интересует, является ли моя функция всегда выполняться в одном потоке.
Существует руководство: http://lldb.llvm.org/formats.html, которое имеет все необходимые переменные, но по какой-то причине они не работают с командами p/expr.
Поэтому я хотел бы получить что-то вроде p $ {thread.id} или expr - thread.id, но мне не повезло с ними.
Метод, который я знаю, плох:
p/x (long) pthread_self()
и получить имя:
p new char [256]//он вернет подходящий указатель, например $ 3 = 0x000000007480840
p (int) pthread_getname_np ((pthread_t) yourId, $ 3, (size_t) 256)//он записывает имя потока в буфер
p $ 3//вы увидите его имя
p удалить $ 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, поэтому я могу видеть идентификатор потока и имя, когда останавливаюсь.
Если вы работаете в Xcode, вы обычно не увидите информацию о потоке, напечатанную при остановке, потому что Xcode не отсылает каждую остановку в консоль Xcode. Но вы можете вызвать некоторую часть этой информации с помощью команды "информация потока":
(lldb) thread info
thread #1: tid = 0x34ca69, name = A_Cool_Thread, function: -[SKTGraphicView alignLeftEdges:] , stop reason = breakpoint 2.1
Поэтому для ваших целей вы можете поместить команду останова на контрольные точки, которые вам нужны, и иметь команду "информация потока". Тогда каждая остановка покажет вам идентификатор и имя, между прочим.
Обратите внимание, что другим способом сделать то же самое можно было бы использовать команды точки останова 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 идентификатор потока, который указан здесь, не является идентификатором pthread. Идентификатор pthread гарантирован только для всех потоков, которые существуют в данный момент времени в программе, поэтому, когда каждый поток в программе в данный момент времени будет иметь разные идентификаторы pthread, нет гарантии, что два потока в разное время будут имеют разные идентификаторы pthread. Однако Mac OS X имеет "уникальный идентификатор потока в глобальном масштабе", который уникален во всех программах. Это то, что этот идентификатор потока.