Почему DTrace дает мне недопустимо-адресные ошибки иногда, но не всегда?

Я обычно готовлю свои диаграммы UML в Visio (я знаю, я знаю; но что такое ya, собирающийся делать?).

При схематическом изображении свойств, они заканчивают как так:

+------------------------+
| MyClass                |
|------------------------|
| - _foo : int           |
|------------------------|
| «property» + Foo : int |
+------------------------+

В «propertyВ» быть пользовательским стереотипом, полученным из В «operatorВ».

Ужасный, я знаю. Но это работает, и это ясно. Я делаю конструкторов тот же путь.

5
задан hippietrail 21 November 2012 в 11:52
поделиться

3 ответа

Я сам не полностью отследил это. Возможно, DTrace пытается разрешить некоторые символы Objective-C. Хотя DTrace - это средство динамической трассировки, оно плохо сочетается с Objective-C, динамически загружающим объекты во время выполнения. Когда Objective-C загружает новые классы и т. Д., DTrace должен решить эту проблему, и это займет немного времени, особенно когда ваше приложение только запускается. Даже если он загружает вещи, а ваше приложение objc все еще загружает новые классы в среду выполнения objc, его возможная DTrace может быть испорчена и печатать методы в неправильном порядке (если вы заботитесь о том, чтобы увидеть, как выполняются методы правильного порядка) , распечатать неверные результаты синхронизации и т. д.

Хотя DTrace - это средство динамической трассировки, оно плохо сочетается с Objective-C, динамически загружающим объекты во время выполнения. Когда Objective-C загружает новые классы и т. Д., DTrace должен решить эту проблему, и это займет немного времени, особенно когда ваше приложение только запускается. Даже если он загружает вещи, а ваше приложение objc все еще загружает новые классы в среду выполнения objc, его возможная DTrace может быть испорчена и печатать методы в неправильном порядке (если вы заботитесь о том, чтобы увидеть, как выполняются методы правильного порядка) , распечатать неверные результаты синхронизации и т. д.

Хотя DTrace - это средство динамической трассировки, оно плохо сочетается с Objective-C, динамически загружающим объекты во время выполнения. Когда Objective-C загружает новые классы и т. Д., DTrace должен решить эту проблему, и это займет немного времени, особенно когда ваше приложение только запускается. Даже если он загружает вещи, а ваше приложение objc все еще загружает новые классы в среду выполнения objc, его возможная DTrace может быть испорчена и печатать методы в неправильном порядке (если вы заботитесь о том, чтобы увидеть, как выполняются методы правильного порядка) , распечатать неверные результаты синхронизации и т. д.

2
ответ дан 13 December 2019 в 22:13
поделиться

Это мое лучшее предположение, основанное на предоставленной информации.

DTrace был специально разработан таким образом, чтобы сделать сценарии DTrace максимально детерминированными. Вот почему нет операторов if , циклов, подпрограмм (кроме псевдо-подпрограмм, предоставляемых самим DTrace) и т. Д. Это потому, что код в вашем сценарии DTrace выполняется в режиме ядра, а не пользователем -земля как часть отслеживаемого процесса (ов). В общем, информация, к которой имеет доступ DTrace, предназначена только для чтения (как и большинство обобщений, это не совсем так), возможность вертеть биты в программах или ядре с помощью чего-то столь же мощного, как DTrace, может заставить все пойти очень-очень неправильно, очень-очень быстро.

Доллары в пончики, проблема в тебе » Это связано с тем, что страница, на которую указывает указатель, не отображается в ядро ​​системой виртуальной машины. DTrace может проверять информацию только о памяти, которая находится в ядре - он не может вызвать двойную ошибку при загрузке системы виртуальной машины на странице.

Вы, вероятно, сможете облегчить проблему, если знаете, что именно классы "должны" быть и принудительно отображать страницы в ядро, выполняя набор фиктивных операторов NSLog (), которые ссылаются на необходимые классы в какой-то удобный момент в начале запуска ваших программ.

0
ответ дан 13 December 2019 в 22:13
поделиться

Колин довольно близок к правильному.

См .:

http://www.friday.com/bbum/2008/01/03/objective-c-using-dtrace -to-trace-messages-to-nil /

Скорее всего, вам нужно установить для переменной среды DYLD_SHARED_REGION значение , чтобы избежать . dtrace действительно работает только с отображаемой памятью, которая фактически находится в физической памяти.

Вы можете выяснить, чего не хватает, используя инструмент командной строки vmmap .

Выполните vmmap PID в вашем приложении после создания вышеуказанных сообщений об ошибках. Просматривая выходные данные, посмотрите, в какой регион попадают адреса типа 0x90206b98 . Учитывая этот адрес, он, скорее всего, находится в незаписываемом разделяемом фрагменте памяти, который, вероятно, не является резидентным, и поэтому dtrace не может читать из него.

5
ответ дан 13 December 2019 в 22:13
поделиться