Ответ 1
Это сложная область, как отметил Sedate Alien. Вам нужно будет реализовать свой собственный стек, чтобы получить трассировку стека из других активных потоков; 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 и т.д.).