Входы для улучшения отладочнойспособности кода отдельно от журналов и кодов ошибок
-
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).