Как просмотреть все активные темы в приложении для iPad
В создаваемом мною приложении для iPad я пытаюсь обработать необработанные исключения, выдавая callStackSymbols исключения. Это может быть сделано с [NSException callStackSymbols]
Тем не менее, я хотел бы иметь возможность видеть callStackSymbols на всех других активных потоках. Я знаю, что могу использовать [NSThread callStackSymbols]
в любом потоке, но мне нужно перебрать все активные потоки, чтобы сделать это.
Это возможно?
2 ответа
Это сложная область, как отметил Седате Чужой. Вам нужно будет реализовать свой собственный обход стека, чтобы получить трассировку стека из других активных потоков; Такие API, как backtrace(3) и +[NSThread callStackSymbols], будут создавать только обратную трассировку для текущего потока.
Так как я знаком с кодом PLCrashReporter, я просто буду использовать его для примеров:
Чтобы получить список потоков, вам нужно использовать task_threads (): https://opensource.plausible.coop/stash/projects/PLCR/repos/plcrashreporter/browse/Source/PLCrashLogWriter.m?at=refs%2Ftags%2F1.0#694
Получив список потоков, вы можете получить состояние потока с помощью thread_get_state (): https://opensource.plausible.coop/stash/projects/PLCR/repos/plcrashreporter/browse/Source/PLCrashFrameWalker_arm.c?at=refs%2Ftags%2F1.0#73
Используя состояние потока, вы можете пройтись по стеку цели: https://opensource.plausible.coop/stash/projects/PLCR/repos/plcrashreporter/browse/Source/PLCrashFrameWalker_arm.c?at=refs%2Ftags%2F1.0#104
Обратите внимание, что весь этот код немного необычен, так как он выполняется внутри обработчика сигнала и написан так, чтобы быть асинхронным; если вы не знакомы со сложностями, связанными с обработкой сигналов, это хорошая отправная точка: http://www.mikeash.com/pyblog/friday-qa-2011-04-01-signal-handling.html
Реализация такого рода вещей - гигантская головная боль; Я действительно рекомендую вам использовать PLCrashReporter или один из продуктов, построенных на его основе ( QuincyKit, HockeyApp, Atlassian JMC и т. Д.).
Кажется, это чревато опасностью, вдвойне, если вам нужно обратиться за помощью. Могу ли я предложить PLCrashReporter? Его перечисленные особенности:
- Реализован как полностью обработанный асинхронный обработчик сигнала.
- Не мешает отладке в gdb
- Обрабатывает как необработанные исключения Objective-C, так и фатальные сигналы (SIGSEGV, SIGBUS и т. Д.)
- Обратные следы для всех активных тем предоставляются. (акцент мой)
- Предоставляет полное состояние регистра для потерянного потока.
Еще лучше взглянуть на QuincyKit, очень удобную оболочку для PLCrashReporter.