Как получить отладочный поток выполнения в C ++ - PullRequest
1 голос
/ 26 апреля 2010

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

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

Однако это не говорит мне, что делал пользователь.

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

Идеи мудрые: я думал о MACRO в верхней части каждой функции, которая действовала как трассировка стека (только я мог предоставить дополнительную информацию о пользователе, такую ​​как идентификаторы сделок, выбор пользовательских диалогов и т. Д.). Система будет записывать трассировки стека. (для каждого потока) и сохраняйте историю в циклическом буфере (различаясь по размеру, в зависимости от того, сколько истории вы хотите захватить). Затем в случае сбоя я могу сбросить этот стек истории.

Мне бы очень хотелось услышать, есть ли у кого-нибудь лучшее решение или кто-нибудь знает о существующей платформе?

Спасибо Рич

Ответы [ 3 ]

1 голос
/ 26 апреля 2010

Ваше решение звучит довольно разумно, хотя, возможно, вместо того, чтобы просматривать журнал аудита в отладчике, вы можете запустить его печать с помощью обработчиков atexit (). Что-то такое простое, как стек строк, в которых есть __FILE __, __ LINE __, pthread_self () и что достаточно хорошо

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

0 голосов
/ 26 апреля 2010

Я предлагаю создать еще один (циклический) файл журнала, который содержит вашу подробную информацию. Помните, что этот файл будет расти в геометрической прогрессии по сравнению с другими файлами.

Другой способ - сохранить последние N транзакции. Напишите программу, которая читает журнал транзакций и передает данные в ваше виртуальное приложение. Это может помочь создать причину. Я использовал эту технику со встроенными системами раньше.

0 голосов
/ 26 апреля 2010

Торговые системы обычно не страдают от снижения производительности инструментальных средств этого уровня. В частности, системы на основе C ++, как правило, жертвуют простотой отладки для повышения производительности. В противном случае, больше компаний будут разрабатывать такие системы на Java / C #.

Я бы избегал попытки ввести трассировки стека в C ++. Я также не уверен, что вы могли бы внедрить такую ​​систему таким образом, чтобы не повлиять каким-либо образом на поведение программы (например, повлиять на поведение потоков).

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

В настоящее время вы регистрируете весь сетевой трафик с клиента? Многие системы на основе FIX записывают это для целей регулирования. Вы можете легко зарегистрировать свой ввод / вывод?

...