Реализация трассировки на i386 - PullRequest
4 голосов
/ 08 марта 2010

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

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

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

Спасибо

Mark

Ответы [ 6 ]

2 голосов
/ 08 марта 2010

Функции glibc backtrace() и backtrace_symbols() из execinfo.h могут быть полезны.

2 голосов
/ 08 марта 2010

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

1 голос
/ 08 марта 2010

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

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

0 голосов
/ 09 июля 2011

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

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

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

0 голосов
/ 08 марта 2010

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

0 голосов
/ 08 марта 2010

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

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

...