2016-02-14 4 views
3

Я работаю над проектом, который включает в себя множество утверждений (как и должно). Проблема в том, что я не могу заставить GDB нарушить ошибку утверждения; он просто печатает сообщение о неудачной ошибке утверждения и прерывает программу. На основе предыдущих постов я добавил, но безрезультатно, следующие точки останова:Как заставить GDB остановиться при ошибке утверждения?

break g_log if log_level == G_LOG_LEVEL_CRITICAL 
break g_log if log_level == G_LOG_LEVEL_WARNING 
break __assert 
break _assert 
break abort 
break exit 
break __assert_fail 

GDB принимает и перечисляет все эти в качестве активных точек останова. Несмотря на это, без перерыва, просто хороший «утверждение не удалось ...» сообщение и программа останавливается ... Спасибо заранее, С наилучшими пожеланиями, Дэйв

ответ

3

Проблема заключается в том, что я не могу получить GDB для перерыв на провал утверждение

нормально, вы не должны делать ничего : abort посылает SIGABRT к процессу, который улавливает GDB по умолчанию. Вы должны быть в состоянии подтвердить это, скомпилировав этот тестовый пример:

#include <assert.h> 
int main() { assert(0 == 1); return 0; } 

и работает под GDB.

Наиболее вероятной причиной вашей проблемы является то, что вы отлаживаете неправильный процесс, а не тот, который фактически прерывается. Может быть, это детский процесс, который фактически не подтверждает утверждение?

GDB set follow-fork-mode может помочь здесь.

Другим способом вы можете отлаживать это путем замены стандартного __assert_fail с: (. Просто ссылку выше кода в основной исполняемый файл, и он должен «упредить» libc.so копию __assert_fail)

#include <stdio.h> 
int foo; 
void __assert_fail(const char *assertion, const char *file, int line, 
        const char *function) 
{ 
    fprintf(stderr, "MY assertion failed: %s in %s, %s:%d\n", 
      assertion, function, file, line); 
    while (foo == 0) /*spin*/; 
} 

Теперь, когда утверждение терпит неудачу, процесс будет вращаться вечно, а не умирать с SIGABRT, и это позволит вам найти его (например, top) и прикрепить к нему с помощью GDB.

Смежные вопросы