Что такое “Прерывание аварийного прекращения работы” и как я отлаживаю его?

Простой - модуль csv также работает со списками:

>>> a=["1,2,3","4,5,6"]  # or a = "1,2,3\n4,5,6".split('\n')
>>> import csv
>>> x = csv.reader(a)
>>> list(x)
[['1', '2', '3'], ['4', '5', '6']]
7
задан Hank Gay 11 January 2009 в 02:33
поделиться

1 ответ

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

Однако проблема с Вашим кодом выше состоит в том, что NSInteger не является типом объекта, это - регулярный примитив. Для исправления ошибки замените провальную строку этим:

NSString *filter = [NSString stringWithFormat:@"id = %lld", (long long)ds.Id];

Первый, stringWithFormat берет NSString объект в качестве параметра, таким образом, необходимо использовать символ, чтобы указать, что строковый литерал является NSString. Это очень важно, так как @"blah blah" на самом деле переводится в объект. Вызов, который Вы выполняете к stringWithFormat, ожидает, что информация об объекте NSString будет резидентным объектом в том адресе памяти, но вместо этого это получает строку символов и скорее всего взрывается там. Удостоверьтесь, что все Ваши строковые литералы @"blah blah", где тип NSString ожидается и что они не простые струны до.

1115-секундный, символ в строке формата указывает объект. Так как NSInteger не является объектом, Вы не можете использовать этот символ формата. Вместо этого используйте %lld для определения долгого длинного целого. Наконец, Вы не должны добавлять nil в конце списка параметров при использовании stringWithFormat, так как сама строка формата указывает сколько параметров для ожидания.

Как в стороне, причина, которая %lld используется вместо всего %d, состоит в том, что NSInteger изменяет размер в зависимости от того, компилируете ли Вы для 32-разрядной или 64-разрядной цели. Путем продвижения NSInteger эти long long тип и использования %lld спецификатор Вы удостоверяетесь, что у Вас не будет проблем усечения в будущем, если Вы скомпилируете для 64-разрядного, и Ваше значение NSInteger требует, чтобы больше чем 32 бита сохранили.

11
ответ дан 6 December 2019 в 23:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: