Как установить конкретные точки останова в Xcode? - PullRequest
5 голосов
/ 08 декабря 2010

Я отлаживаю сбой, когда неосновной поток использует методы рисования UIKit. Я хотел бы установить условную точку останова на -[UIView layoutSubviews], которая срабатывает только, если она выполняется в неосновном потоке. Возможно ли это?

Ответы [ 2 ]

4 голосов
/ 05 января 2011

Вы можете установить точки прерывания для каждого потока, используя консоль GDB.Например:

b -[UIView layoutSubviews] thread 2

(Вы используете команды gdb "info threads", чтобы увидеть, какие потоки существуют и какой идентификатор gdb использует для них).

Я не думаю, что есть способустановить точку останова для каждого потока , за исключением основного потока (потока 1), но если у вас есть разумное количество потоков, вы можете при необходимости установить точки останова для каждого из них отдельно.


update:

Если из-за GCD ничего не получается из-за потока, другой подход, который вы могли бы использовать, это просто установить обычную точку останова и установить команды gdb для этой точки прерывания, чтобы выгружатьbacktrace («где») и затем «продолжить».

1 голос
/ 05 января 2014

Есть очень полезный бит кода , который выполняет именно то, что вы просите. Это также намного быстрее, чем использование точек останова. Это делается методом быстрого переключения нескольких методов UIKit (setNeedsLayout, setNeedsDisplay и т. Д.) И выдачи подтверждения, если оно вызывается в потоке, отличном от основного.

Он отлично работает для выявления этих недостатков во время разработки, но не забудьте удалить его из производственного кода. При необходимости также легко адаптироваться к AppKit.

...