lldb / Xcode: как напечатать индекс нити, идентификатор или имя?

0

Проблема: я хочу отслеживать программу с помощью точек останова с действием в 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//если вы беспокоитесь о утечке памяти

но он выглядит довольно плохим обходным путем и не подходит для контрольных точек.

  • 0
    Эти переменные, как известно, не работают в выражениях, это полностью задумано. Если вы хотите получить информацию о потоке в выражении, вам нужно сделать это так же, как в коде.
Теги:
xcode
lldb

1 ответ

2
Лучший ответ

Форматы, указанные на странице "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 имеет "уникальный идентификатор потока в глобальном масштабе", который уникален во всех программах. Это то, что этот идентификатор потока.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню