Инструмент genstrings выдает исключение, прерывая при разборе проекта XCode - PullRequest
3 голосов
/ 27 февраля 2011

Я использовал genstrings для создания строковых файлов, чтобы интернационализировать мое приложение для iPhone. Однако некоторые изменения, которые я сделал недавно, привели к тому, что инструмент genstrings начал выдавать ошибки, подобные этой:

s1075-88:Directory jason$ genstrings -o en.lproj *.m
2011-02-26 16:42:26.941 genstrings[17962:903] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSCFString characterAtIndex:]: Range or index out of bounds'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x00007fff82a267b4 __exceptionPreprocess + 180
    1   libobjc.A.dylib                     0x00007fff85c640f3 objc_exception_throw + 45
    2   CoreFoundation                      0x00007fff82a265d7 +[NSException raise:format:arguments:] + 103
    3   CoreFoundation                      0x00007fff82a26564 +[NSException raise:format:] + 148
    4   Foundation                          0x00007fff841a65e1 -[NSCFString characterAtIndex:] + 97
    5   genstrings                          0x0000000100001b9d 0x0 + 4294974365
    6   genstrings                          0x0000000100003080 0x0 + 4294979712
    7   genstrings                          0x0000000100003ee6 0x0 + 4294983398
    8   genstrings                          0x0000000100000d20 0x0 + 4294970656
)

Что может быть причиной этого, и как я могу найти часть моего проекта, которая вызывает это, не изменяя все вручную?

Ответы [ 7 ]

3 голосов
/ 27 февраля 2011

Здесь нет простых трюков.

Скопируйте все ваши файлы .m в отдельную папку, а затем выполните бинарный поиск.

запустите genstrings на половине файлов и посмотрите, есть проблема или нет.Выясните, в какой половине файлов возникла проблема, и повторите ее ...

Это ошибка внутри genstrings, так что вы мало что можете с этим сделать.

2 голосов
/ 01 января 2012

Вы можете ограничить число файлов, обрабатываемых genstrings, используя head.Если это ваша команда для локализации всех файлов:

find . -name \*.m | xargs genstrings -o en.lproj

Тогда вот как это выглядит при использовании head:

find . -name \*.m | head -5 | xargs genstrings -o ~/Documents/GenStringsTest

Просто увеличьте число рядом с головой и запуститекоманда снова и снова, пока не произойдет сбой.Между запусками вы можете удалять файлы во временной папке GenStrinsTest.Когда произойдет сбой, уменьшайте число до тех пор, пока вы точно не окажетесь в месте сбоя, а затем запустите

find . -name \*.m | head -<minimum number of files for crash>

, и последний файл, который будет записан на консоли, будет «неправильным».

1 голос
/ 08 февраля 2012

В случае, если это поможет кому-то еще, я получил этот сбой при наличии NSLocalizedString в комментарии.Я думаю, он нашел его, и у него не было параметров и вылетов

0 голосов
/ 05 июня 2018

Это ошибка, которая генерируется, когда genstrings не может найти конец вызова макроса.

Обратите внимание, что утилита genstrings не может обрабатывать вызовы, которые занимают несколько строк (независимо от того, есть комментарий внутри или нет).

Так что это работает:

NSLocalizedString(@"Key", @"Comment")

но это не

NSLocalizedString(@"Key",
                  @"Comment")
0 голосов
/ 31 октября 2017

Свифт 4

"""
This is a comment
"""
Синтаксис

, похоже, тоже приводит к сбою.

0 голосов
/ 23 июня 2013

Для меня это произошло из-за комментария внутри вызова NSLocalizedString.

Например:

NSLocalizedString(@"some text" /* a comment */,  
                  @"some other text.");

вызывает сбой genstrings, но это нормально:

/* a comment */
NSLocalizedString(@"some text", @"some other text.");
0 голосов
/ 22 мая 2013

Я столкнулся с этой проблемой. В моем случае genstrings сканировал <filename>.m.orig файлы, оставшиеся после git-слияния. Удаление файлов *.m.orig исправило ошибки, так как они должны были содержать искаженные локализованные строки.

...