Регистрация / мониторинг всех вызовов функций из приложения - PullRequest
6 голосов
/ 30 сентября 2008

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

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

Мы используем Visual Studio 2008 (C ++).

Спасибо

1009 * A.B. *

Ответы [ 6 ]

3 голосов
/ 30 сентября 2008

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

2 голосов
/ 30 сентября 2008

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

2 голосов
/ 30 сентября 2008

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

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

2 голосов
/ 30 сентября 2008

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

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

2 голосов
/ 30 сентября 2008

Для Visual C ++ _penter () и _pexit () могут использоваться для инструментов вашего кода.

См. Также Перехват вызова метода в C ++ .

0 голосов
/ 30 сентября 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...