OSX - NSLog предотвращает сбой приложения в режиме отладки - PullRequest
3 голосов
/ 24 февраля 2012

Разработка приложения для OSX.Все еще есть ошибки, и он вылетает в сборках релиза.

Однако, он запускается в сборках отладки, когда в нескольких местах есть пустой оператор NSLog.Если операторы NSLog удаляются, приложение аварийно завершает работу при запуске.

Первый оператор в цикле выполнения (печатает рассчитанные тики и нарисованные кадры, имитирует текучую среду в NSView) NSLog (@ "% d тиков,% d frames ", ticks, frames);

Второй оператор в тиковом методе, который вызывается при каждом цикле, NSLog (@" ");

В режиме отладки, запущенном изXCode, он прекрасно работает с этими двумя утверждениями.Если любой из них удален, он падает.После нескольких часов поиска я не могу найти никаких ссылок на сбой приложений без пустых операторов NSLog.

Редактировать: Последний вопрос: есть ли что-то, на что я должен обратить внимание, что может быть причиной этого?

Редактировать 2: Методы выполнения и отметки

-(void) run {
    timeval start = gettime();
    timeval end = gettime();
    float dt = 1./60;
    self.E.dt = dt;
    float tick = 1e6*dt;
    float unprocessed;
    int ticks = 0;
    int frames = 0;
    timeval now;
    while ( TRUE ) {
        now = gettime();
        unprocessed += diff(end, now)/tick;
        end = now;
        BOOL shouldRender = true; // set false to limit framerate to tickrate
        while ( unprocessed >= 1 ) {
            ticks++;
            [self tick];
            unprocessed -= 1;
            shouldRender = true;
        }

        if ( shouldRender ) {
            frames++;
        }

        if ( diff(start, gettime()) > 1000000 ) {
            start.tv_sec += 1;
            NSLog(@"%d ticks, %d frames", ticks, frames);
            frames = 0;
            ticks = 0;
        }
    }
}

-(void) tick {
    NSLog(@"");
    NSDictionary* fs = [NSDictionary dictionaryWithObjectsAndKeys:self.u, @"u", self.v, @"v", self.p, @"p", self.T, "@T", nil];
    NSDictionary* gs = [self.E evolve:fs];
    [self.u swap:[gs objectForKey:@"u"]];
    [self.v swap:[gs objectForKey:@"v"]];
    [self.p swap:[gs objectForKey:@"p"]];
    [self.T swap:[gs objectForKey:@"T"]];
    [self.view setNeedsDisplay:YES];
}

Редактировать 3: Это явно проблема с LLVM.Когда я компилирую с GCC, я не получаю сбой.К сожалению, из-за отсутствия ARC происходит невероятное количество утечек памяти.Уровень путаницы увеличился.

Редактировать 4: Backtrace

Crashed Thread:  2

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x0000000000000010

External Modification Warnings:
Debugger attached to process.

VM Regions Near 0x10:
--> 
    __TEXT                 0000000103a9b000-0000000103a9c000 [    4K] r-x/rwx SM=COW  /Users/USER/Library/Developer/Xcode/DerivedData/Splash-ahjwbarsbqqbuzfcnxstxpslekdi/Build/Products/Debug/Splash.app/Contents/MacOS/Splash

Application Specific Information:
objc_msgSend() selector name: copy
objc[32100]: garbage collection is OFF

Thread 2 Crashed:
0   libobjc.A.dylib                 0x00007fff8e43ee90 objc_msgSend + 16
1   com.apple.CoreFoundation        0x00007fff87edf8ac -[__NSPlaceholderDictionary initWithObjects:forKeys:count:] + 668
2   com.apple.CoreFoundation        0x00007fff87efcd13 +[NSDictionary dictionaryWithObjectsAndKeys:] + 1203
3   com.mbarriault.Splash           0x0000000103a9d488 -[Game tick] + 328 (Game.m:95)
4   com.mbarriault.Splash           0x0000000103a9d2a9 -[Game run] + 361 (Game.m:76)
5   com.apple.Foundation            0x00007fff9020874e -[NSThread main] + 68
6   com.apple.Foundation            0x00007fff902086c6 __NSThread__main__ + 1575
7   libsystem_c.dylib               0x00007fff8dba18bf _pthread_start + 335
8   libsystem_c.dylib               0x00007fff8dba4b75 thread_start + 13

Thread 2 crashed with X86 Thread State (64-bit):
  rax: 0x0000000103aa5a00  rbx: 0x0000000000000004  rcx: 0x0000000000000000  rdx: 0x0000000000000000
  rdi: 0x0000000103aa3071  rsi: 0x00007fff8f9ea7d0  rbp: 0x0000000107b47970  rsp: 0x0000000107b47900
   r8: 0x0000000000000004   r9: 0x0000000103aa5ab0  r10: 0x0000000000000001  r11: 0x0000000000000000
  r12: 0x0000000000000003  r13: 0x0000000107b47928  r14: 0x0000000107b479a0  r15: 0x0000000107b47980
  rip: 0x00007fff8e43ee90  rfl: 0x0000000000010202  cr2: 0x0000000000000010
Logical CPU: 3

Я удалил информацию об идентификаторах и журналы для не сбоев потоков, так как весь журнал превысил ограничение длины сообщения.

Редактировать 5: Изменение создания словаря с NSDictionary:dictionaryWithObjectsAndKeys: на NSDictionary:dictionaryWithObjects:forKeys:, кажется, исправило все мои проблемы.Я не совсем уверен, почему, но я возьму это!Спасибо всем!

Редактировать 6: Правильный ответ, поверьте, если хотите, была простая опечатка в строке.

1 Ответ

2 голосов
/ 24 февраля 2012

Судя по обратному следу, происходит сбой при выделении NSDictionary.Возможно, одна из ссылок на объекты, используемая для инициализации NSDictionary, недействительна.Если вы публикуете код из метода тиков, это может помочь сузить суть проблемы.Кроме того, если вы попытаетесь отладить с NSZombie , это может сказать нам, на каком типе объекта происходит сбой.

Редактировать: ОК.Теперь, когда я вижу код tick, я вижу проблему.Сначала я этого не видел, но вы используете к-строку "@T", которую вы, вероятно, намеревались назвать @ "T".

...