Входы для улучшения отладочнойспособности кода отдельно от журналов и кодов ошибок

StackOverflow https://stackoverflow.com/questions/2177597

  •  24-09-2019
  •  | 
  •  

Вопрос

Помимо кодов ошибок, rings и logs ошибок, есть ли другие функции, которые могут быть включены в код, чтобы увеличить информацию об отладке / трассировке во время выполнения кода, которые могут помочь проблемам отладки (или дайте нам знать, что происходит) во время выполнения?

Это было полезно?

Решение

Вот пример кода, который отправляет штабел в файл при неисправности сегментации

#включатьu003Cstdio.h> #включатьu003Csignal.h> #включатьu003Cstdlib.h> #включатьu003Cstdarg.h> Статический пустотный сигнал_handler (INT); Статический пустотный дамп (пустота); Статическая пустотная очистка (пустота); void init_signals (пустота); пустота паники (const char *, ...); структура Sigaction Sigact; Char * Progname; INT MAIN (INT ARGC, CHAR ** ARGV) {CHAR * S; Progname = * (ARGV); Atexit (очистка); init_signals (); Printf («Обосновать SEG, присваивая нулю на * S  N»); * S = 0; sigemptyset (& sigact.sa_mask); вернуть 0; } void init_signals (void) {sigact.sa_handler = signal_handler; sigemptyset (& sigact.sa_mask); sigact.sa_flags = 0; Сигиция (SIGINT, & Sigact, (struction Sigaction *) null); Sigaddset (& sigact.sa_mask, sigsegv); Sigaction (SIGSEGV, & Sigact, (struction Sigaction *) null); Sigaddset (& sigact.sa_mask, sigbus); Сигиция (SIGBUS и Sigact, (struction Sigaction *) null); Sigaddset (& sigact.sa_mask, sigquit); Сигиция (sigquit, & sagact, (struction sigaction *) null); Sigaddset (& sigact.sa_mask, sighup); Сигиция (SIGHUP, & Sigact, (struction Sigaction *) null); Sigaddset (& sigact.sa_mask, sigkill); Сигиция (SIGKILL и Sigact, (struction Sigaction *) null); } Статический пустотный сигнал_Handler (INT SIG) {IF (SIG == SIGHUP) Panic («Fatal: программа повешена вверх  n»); if (sig == sigsegv || sig == sigbus) {dumpstack (); паника } Если (SIG == SIGQUIT) паника («Завершить сигнал завершить программу  N»); Если (SIG == SIGKILL) паника («Убить сигнал закончила программу  n»); если (sig == sigint); } пустота паники (const char * fmt, ...) {char buf [50]; va_list argptr; va_start (argptr, fmt); vsprintf (buf, fmt, argptr); va_end (argptr); FPRINTF (STDERR, BUF); Выход (-1); } Статический пустотный дамп (пустота) {/ * получил эту рутину от http://www.whitefang.com/unix/faq_toc.html ** Раздел 6.5. Изменено для перенаправления в файл, чтобы предотвратить беспорядок * / char dbx [160]; SPRINTF (DBX, «ECHO», где  NDETACH '| DBX -A% D>% s.dump ", getpid (), progname); Система (DBX); вернуть; } Void Cleanup (void) {sigempmetset (& sigact.sa_mask); / * Любая уборка по дому здесь * /}

В функции dumpstack, dbx необходимо изменить, чтобы удовлетворить ваш отладчик, например gdb Для отладчика GNU этот код использовался, когда я программировал на коробке AIX несколько лет назад. Обратите внимание, как настраиваются сигналы, и если произошла ошибка SIGSEGV, обработчик сбрасывает стек в файл с расширением .dump. Отказ Код демонстрирует ошибку сегментации и сбрасывает штабел.

Это мой любимый код.

Надеюсь, это поможет, наилучшие пожелания, Том.

Другие советы

  • Строить без оптимизации, сохранить как можно больше «намерения» кода
  • Создайте в режиме отладки, чтобы добавить информацию о символах
  • Не разделите исполняемый файл (в системах Linux / Unix), чтобы сохранить максимальную информацию о символах для отладчиков для использования

При строительстве для Linux мне нравится напечатать стек задний от обработчика сигнала. Это помогает отладки аварии (SIGSEGV) Или позволяет мне отправить сигнал в программу для инициирования задней нормы во время выполнения. Core Dumps. Также может быть полезен в отладке аварии (снова в Linux).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top