Вопрос

В настоящее время я переношу наш код с alpha (Tru64) на процессор i386 (Linux) на C.Все шло довольно гладко до тех пор, пока я не занялся переносом нашей программы процедура обработки исключений.В настоящее время у нас есть родительский процесс, который порождает множество подпроцессов, и когда один из этих подпроцессов фатален (не заполнен) У меня есть подпрограммы для перехвата процесса.

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

Любая помощь была бы принята с благодарностью, в идеале я бы написал обработку ошибок для всех процессоров, однако на данном этапе меня действительно волнуют только i386 и x86_64.

Спасибо

Отметка

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

Решение

Функции glibc backtrace() и backtrace_symbols(), из execinfo.h, может оказаться полезным.

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

Вы могли бы посмотреть на http://tlug.up.ac.za/wiki/index.php/Obtaining_a_stack_trace_in_C_upon_SIGSEGV.Он охватывает необходимую вам функциональность.Однако вы должны выполнить ссылку на libgdb и libdl, скомпилировать с помощью -rdynamic (включает больше символов в исполняемый файл) и отказаться от использования некоторых оптимизаций.

Есть две функции GNU (не POSIX), которые могут вам помочь - backtrace() и backtrace_symbols() - первый возвращает массив адресов функций, а второй преобразует адреса в имена.К сожалению, имена статических функций не могут быть разрешены.

Чтобы заставить это работать, вам нужно скомпилировать свой двоичный файл с -rdynamic Отметить.

К сожалению, "лучшего" метода не существует, поскольку расположение стека может варьироваться в зависимости от процессора, операционной системы и компилятора, используемого для компиляции вашего кода.Но эта статья может помочь.

Обратите внимание, что вы должны реализовать это в дочерний процесс;родительский процесс просто получает сигнал о том, что что-то не так;вы не получаете копию дочернего стека.

Если в комментарии вы указываете, что используете gcc.Это http://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Return-Address.html#Return-Address могло бы быть полезно.

Если вас устраивает получение правильных обратных трассировок только при запуске через valgrind, то это может быть вариантом для вас:

VALGRIND_PRINTF_BACKTRACE(формат, ...):

Это даст вам обратную трассировку для всех функций, включая статические.

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