Как получить отладочный поток выполнения в C++

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

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

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

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

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

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

Спасибо Рич

3 ответа

Решение

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

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

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

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

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

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

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

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

Другие вопросы по тегам