2008-09-30 4 views
6

У нас есть проблема с приложением, которое мы разрабатываем. Очень редко, как раз в сто, приложение запускается при запуске. Когда происходит сбой, он выводит всю систему, компьютер начинает подавать звуковой сигнал и полностью зависает, единственный способ восстановить - отключить питание (мы используем Windows XP). Редкость сбоя в сочетании с тем фактом, что мы не можем ворваться в отладчик или даже генерировать stackdump, когда это происходит, очень затрудняет отладку.Регистрация/мониторинг всех вызовов функций из приложения

Я ищу что-то, что регистрирует все вызовы функций в файл. Существует ли такой инструмент? Невозможно реализовать, профайлеры вроде VTune делают что-то очень похожее.

Мы используем визуальную студию 2008 (C++).

Thanks

A.B.

ответ

0

GCC (включая версию MingGW for Windows development) имеет переключатель генерации кода под названием -finstrument-functions, который говорит компилятор испускать специальные вызовы функций, называемых __cyg_profile_func_enter и __cyg_profile_func_exit вокруг каждого вызова функции. Для Visual C++ существуют аналогичные опции: /GH и /Gh. Это заставляет компилятор вызывать вызовы __penter и __pexit вокруг вызовов функций.

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

Если возможно, я также попытался запустить вашу систему с помощью valgrind или аналогичного инструмента проверки. Это может уловить вашу проблему, прежде чем она выйдет из-под контроля.

2

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

Если бы это было мне, я бы попробуйте запустить программу на другом ПК - это может быть сломанное аппаратное обеспечение или драйверы, вызывающие проблему. Прикладная программа «не должна» удалять систему.

2

Несколько идей-
Существует хорошая вероятность, что перед вашим сбоем есть какое-то исключение в приложении. если вы установите обработчик для всех необработанных исключений с помощью SetUnhandledExceptionFilter() и напишите трассировку стека в файл журнала, у вас может быть шанс поймать крах в действии.
Просто не забудьте очистить файл после каждой записи.

Другой вариант - использовать такой инструмент, как strace, который регистрирует все системные вызовы в ядре (для этого есть несколько вариантов и реализаций, чтобы выбрать ваш любимый). если вы посмотрите на журнал непосредственно перед сбоем, вы можете найти виновника

+0

Благодарим за связь со спуском. – Constantin 2008-10-01 22:37:33

3

Записи/выходы входа в систему - это низкоуровневый подход к вашей проблеме. Я бы предложил использовать автоматическое устройство отладчика (используя ключ отладчика в разделе «Параметры файла образа» с помощью regedit или с помощью gflags из пакета, я предоставляю ссылку ниже) и пытается воспроизвести проблему до сбоя.Кроме того, вы можете иметь историю вызовов функции журнала отладки подозреваемого модуля (ов) с использованием сценария или собирать любую другую информацию.
Но не зная подробностей вашего приложения, очень сложно предложить решение. Это пользовательское приложение, сервис или драйвер? Что означает «сбой при запуске» - при запуске Windows или при запуске приложения?
Используйте этот debugger package для устранения неполадок.

2

Рассматривали ли вы использование второй машины в качестве удаленного отладчика (через сеть)? Когда приложение (и система) выходит из строя, вторая машина должна показывать некоторую полезную информацию, если не фактическая точка проблемы. Я считаю, что VC++ обладает такой способностью, по крайней мере, в некоторых версиях.

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