В полностью оптимизированном коде нет 100% надежного способа определения вызывающего абонента для определенного метода.Компилятор может использовать оптимизацию хвостового вызова, в то время как компилятор эффективно повторно использует кадр стека вызывающего для вызываемого.
Чтобы увидеть пример этого, установите точку останова для любого данного метода, используя gdb, и посмотрите на обратную трассировку,Обратите внимание, что вы не видите objc_msgSend () перед каждым вызовом метода.Это потому, что objc_msgSend () выполняет хвостовой вызов для реализации каждого метода.
Хотя вы можете скомпилировать ваше приложение неоптимизированным, вам потребуются неоптимизированные версии всех системных библиотек, чтобы избежать только этой одной проблемы.
И это только одна проблема;по сути, вы спрашиваете «как мне изобрести CrashTracer или gdb?».Очень сложная проблема, на которой делается карьера.Если вы не хотите, чтобы «инструменты отладки» были вашей карьерой, я бы не советовал идти по этому пути.
На какой вопрос вы действительно пытаетесь ответить?