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