Как узнать, кто назвал метод?

Для приложения.NET я выбираю" .NET Parallel Extensions (PLINQ)", это чрезвычайно просто в использовании и позволяет мне параллелизировать существующий код в минутах.

  1. просто учиться
  2. Используемый для выполнения сложных операций по большим массивам объектов, таким образом, я не могу прокомментировать другие приложения
  3. , задачи Поддержек и piplines
  4. Должны поддерживаться для следующих нескольких годы, но кто знает наверняка?
  5. версия CTP имеет некоторые проблемы производительности, но уже выглядит очень перспективной.

Моно , вероятно, доберется поддержка PLINQ, таким образом, это могло быть межплатформенное решение также.

11
задан Another Registered User 25 November 2009 в 00:51
поделиться

5 ответов

В полностью оптимизированном коде нет 100% верного способа определить вызывающего абонента определенного метода. Компилятор может использовать оптимизацию хвостового вызова, тогда как компилятор эффективно повторно использует кадр стека вызывающего объекта для вызываемого.

Чтобы увидеть пример этого, установите точку останова для любого заданного метода с помощью gdb и посмотрите на трассировку. Обратите внимание, что вы не видите objc_msgSend () перед каждым вызовом метода. Это потому, что objc_msgSend () выполняет хвостовой вызов для каждой реализации метода.

Хотя вы можете скомпилировать свое приложение без оптимизации, вам понадобятся неоптимизированные версии всех системных библиотек, чтобы избежать только этой проблемы.

И это всего лишь одна проблема; по сути, вы спрашиваете: «Как мне заново изобрести CrashTracer или gdb?». Очень сложная проблема, на которой строятся карьеры.

35
ответ дан 3 December 2019 в 00:56
поделиться
2
ответ дан 3 December 2019 в 00:56
поделиться

Эту информацию можно получить с помощью DTrace .

1
ответ дан 3 December 2019 в 00:56
поделиться

Создайте макрос, который добавляет __ FUNCTION __ к имени функции при вызове функции. Затем этот макрос вызовет вашу функцию с дополнительным параметром символа * для целевой функции.

1
ответ дан 3 December 2019 в 00:56
поделиться

В общем случае это невозможно без фактического обхода стека. Нет даже гарантии, что другой объект отправит сообщение, вызывающее метод. Например, его можно вызвать из блока в обработчике сигнала.

3
ответ дан 3 December 2019 в 00:56
поделиться