Отладка ошибок чувствительности к регистру в приложениях
Чувствительные к регистру загрузочные тома становятся более распространенными с появлением чувствительного к регистру HFS Плюс, и файловая система в iPhone OS также чувствительна к регистру. К сожалению, много приложений не работают правильно над чувствительными к регистру объемами. Этот technote описывает методы для того, чтобы разыскать ошибки чувствительности к регистру и фиксировать их. Это также обеспечивает предложения для тестирования методов, чтобы препятствовать тому, чтобы новые ошибки чувствительности к регистру появились в будущем. Этот technote предназначается и для Mac OS X и для разработчиков iPhone.
Введение
Начинаясь в версии 10.5 Mac OS X, (или 10.4 Серверов), Mac OS X поддерживает чувствительный к регистру HFS Плюс формат объема. Поскольку чувствительный к регистру HFS Плюс производительность сопоставим с тем из стандартных HFS Плюс, чувствительные к регистру загрузочные тома намного больше распространены. Машина времени и iPhone OS также используют чувствительные к регистру объемы, добавляя дальнейший импульс к этому тренду. С этим повышением популярности это больше не целесообразно предполагать, что пользователи только ряда Вашего приложения будут использовать чувствительные к регистру объемы.
Чувствительность к регистру обнаруживает много скрытых ошибок в существующем программном обеспечении, вызванном разработчиками, использующими прописные буквы для доступа к файлам, имена которых содержат строчные буквы и наоборот. Чувствительность к регистру также приносит с ним много проблем для разработчиков приложений, которые должны теперь удостовериться что их работа приложений правильно в двух средах — чувствительный к регистру HFS Плюс и нечувствительный к регистру HFS Плюс. Этот technote показывает Вам, как решить эти проблемы и заняться этими новыми проблемами.
Например, сценарии в этом technote могут использоваться, чтобы обнаружить, если Вашему приложению не удалось бы (на чувствительном к регистру HFS Плюс) загрузить ресурсы, найдите его предпочтения, или правильно считайте и запишите предпочтения, совместно использованные среди комплекта приложений.
Разыскивание ошибок чувствительности к регистру
С несколькими командами оболочки можно сделать разыскивание ошибок чувствительности к регистру относительно прямым. Перед началом Вам будут нужны и нечувствительный к регистру загрузочный том и в чувствительный к регистру объем или образ диска. Установите свое приложение в обоих местах перед продолжением.
Процесс очень прост. Во-первых, начальная загрузка от нечувствительного к регистру HFS Плюс объем, затем сохраните следующий код как сценарий:
К перечислению 1 , Проверяющему пути, получает доступ приложение
#!/bin/sh
# Change this to be the volume name of your case-sensitive volume.
CSVOLUMENAME="HFSPlusCS"
# Change this to be the doubly quoted path to your application (see note below)
APPLICATIONPATH="/Applications/My\ Application/My\ Application.app/Contents/MacOS/My\ Application"
# This command runs your application and records all system calls into the file "fileaccess.log" in the current directory.
sudo dtruss "$APPLICATIONPATH" >& fileaccess.log
# The following commands pull out any file accesses from the dtruss
# results, then strip off everything but the path itself (which appears
# in the dtruss output as a double-quoted string terminated with a
# backslash and a zero).
grep 'open(' fileaccess.log | grep -v 'shm_open(' | sed 's/.*open("//g' | sed 's/\\0".*//g' > fileaccesslist
grep 'open_nocancel(' fileaccess.log | sed 's/.*open_nocancel("//g' | sed 's/\\0".*//g' >> fileaccesslist
grep 'stat(' fileaccess.log | grep -v 'fstat(' | grep -v 'getfsstat(' | sed 's/.*stat("//g' | sed 's/\\0".*//g' >> fileaccesslist
grep 'stat64(' fileaccess.log | grep -v 'fstat64(' | sed 's/.*stat64("//g' | sed 's/\\0".*//g' >> fileaccesslist
grep 'getattrlist(' fileaccess.log | sed 's/.*getattrlist("//g' | sed 's/\\0".*//g' >> fileaccesslist
# This checks to see if the file exists in the current boot volume
# (case-insensitive), then checks to see if the same file exists on
# the case-sensitive volume.
for i in $(cat fileaccesslist) ; do
if [ -f "$i" -a ! -f "$CSVOLUMENAME/$i" ] ; then
echo "$i"
fi
done |
Теперь, фиксируйте следующее:
Скорректируйте путь к своему приложению и имени объема (если это не вызывают
HFSPlusCS). Например, при разработке приложения для iPhone Вы установили быAPPLICATIONPATHпеременная к"/Developer/Platforms/iPhoneSimulator.platform/Developer/Applications/iPhone\ Simulator.app/Contents/MacOS/iPhone\ Simulator"(включая двойные кавычки).Заключите имя приложения в кавычки (в) правильно. Путь приложения передал
dtrussдолжен быть вдвойне заключен в кавычки, с наклонными чертами влево перед пробелами, одинарными кавычками или двойными кавычками, и с дополнительным набором двойных кавычек вокруг внешней стороны. Это вызвано тем, чтоdtrussсценарий оболочки, правильно не заключающий эти пути в кавычки внутренне. Если эта ошибка вdtrussфиксируется в будущем, просто удалите или наклонные черты влево или двойные кавычки.
Убедитесь, что у Вас есть символ новой строки (используйте окончания строки UNIX) между кавычками в IFS оператор присваивания (и только новая строка). Считайте Shell, Пишущий сценарий Учебника для начинающих для приобретения знаний о внутреннем разделителе полей (IFS) переменная.
Затем, введите chmod a+x testscript.sh (или независимо от того, что Вы назвали свою копию сценария тестирования) сделать его исполнимой программой. Убедитесь, что чувствительный к регистру объем или образ диска смонтированы, затем введите ./testscript.sh выполнять сценарий.
Протестируйте свое приложение, как Вы обычно были бы. Когда Вы будете сделаны, выйдите из приложения. Как только Вы выходите из приложения, необходимо получить список каждого файла в комплекте приложений, к которому получили доступ с неправильным случаем. Теперь поиск каждого из них в XCode (с неконтролируемой опцией «Ignore case»), найдите ошибочные строки и фиксируйте их. Это - это простое.
Предотвращение проблем чувствительности к регистру в будущем
Необходимо всегда создавать и тестировать приложения для iPhone с помощью чувствительного к регистру объема. Когда Вы перемещаетесь от средства моделирования до фактического iPhone, Используя нечувствительную к регистру файловую систему может привести к новым ошибкам разоблачение. И потому что iPhone OS использует чувствительную к регистру файловую систему исключительно, нет никакого преимущества к тестированию приложений для iPhone на нечувствительных к регистру объемах вообще.
При разработке приложений для Mac OS X самый простой способ избежать проблем чувствительности к регистру прост: сделайте большую часть своего тестирования на чувствительном к регистру HFS Плюс. Если Вы всегда тестируете на чувствительном к регистру HFS Плюс, если Вы не стараетесь изо всех сил повреждать вещи (преднамеренно создающий временные файлы, имеющие то же имя как открытые документы, но с различным случаем, например), единственная проблема, с которой Вы, вероятно, встретитесь, имеет два различных файла в Вашем проекте с тем же именем и различным случаем. Можно тривиально проверить на тот следующим образом:
Проверка перечисления 2 коллизии случая
# List all the files in your application bundle and store the results in the file "filelist" in your home directory. cd "/Applications/My Application.app" find . > ~/filelist # Change back to your home directory cd ~ # Sort the files, folding uppercase and lowercase versions together. # The result is stored in the file "filelist2" in your home directory. sort -f filelist > filelist2 # Sort the files, folding uppercase and lowercase versions together and removing duplicates (insensitively) # The result is stored in the file "filelist3" in your home directory. sort -f -u filelist > filelist3 # Compare the two lists. diff -u filelist2 filelist3 |
Путем выполнения нечувствительного к регистру (сворачивание) вид и устранение копий, любые файлы, отличающиеся только случаем, не будут во второй копии списка. Таким образом сравнение двух списков показывает Вам любые файлы, которые столкнулись бы на нечувствительном к регистру объеме. Можно также использовать этот метод на других папках, чтобы помочь найти виды странных ошибок, происходящих, если Вы открываете предпочтительный файл или временный файл для записи с неправильным случаем и позже читаете назад более старую (устаревшую) копию с помощью правильного случая.
Также можно использовать нечувствительный к регистру объем в качестве целевого объема для сборок. Если два файла имеют то же имя, но различный случай, файлы столкнутся на этапе сборки вместо во время установки. Это позволяет Вам фокусировать большую часть своего тестирования на чувствительных к регистру объемах.
История версии документа
| Дата | Примечания |
|---|---|
| 19.05.2010 | Исправленные незначительные ошибки в сценариях. |
| 04.08.2009 | Новый документ, объясняющий, как исправить ошибки, которые чувствительный к регистру HFS Плюс показывает в приложениях. |