2010-04-26 2 views
1

많은 사용자를 지원하는 글로벌 거래 시스템에서 작업합니다. 각 사용자는 거래를 예약, 수정, 편집, 삭제할 수 있습니다. 이 시스템은 중앙 거래 캡처 서비스에 의해 규제됩니다. 거래 캡처 서비스는 발생하는 모든 업데이트를 모든 사용자에게 알려줍니다.C++에서 디버그 실행 흐름을 얻는 방법

문제가 발생하면 테스트 시스템에서 프로덕션 환경을 다시 작성할 수 없으므로 충돌이 발생하고 크래시 덤프 및 로그 파일에 의존해야합니다.

그러나 사용자가 무엇을했는지는 알 수 없습니다.

저는 (충돌시) 사용자가 수행 한 작업 내역을 덤프 할 시스템을 원합니다. 내가 추가하는 것은 실제 환경에 들어가야하므로 성능에 큰 영향을 미치지 않습니다.

아이디어 현명한 나는 스택 추적과 같은 역할을하는 각 기능의 상단에 MACRO를 생각했다. (트레이드 아이디, 사용자 대화 상자 선택 등과 같은 추가 사용자 정보를 제공 할 수 있었다.) 시스템은 스택을 기록했다. 트레이스 (스레드별로) 및 순환 버퍼에 히스토리를 유지할 수 있습니다 (캡처하려는 히스토리의 양에 따라 크기가 다양 함). 그리고 나서 추락 할 때, 나는이 역사를 쌓아 버릴 수 있었다.

누구든지 더 나은 해결책이 있거나 기존 프레임 워크에 대해 알고 있다면 정말 듣고 싶습니다.

감사 리치

+0

매크로를 사용하지 마십시오. –

+1

더 이상 필요가 없으면 어떻게 제거해야합니까? #ifdefs? – Rich

답변

1

당신의 솔루션은 꽤 합리적입니다.하지만 디버거에서 감사 추적을 보는 대신에 atexit() 핸들러를 사용하여 인쇄 할 수 있습니다. __FILE __, __ LINE __, pthread_self()가 포함 된 문자열 스택만큼이나 단순한 것 같습니다.

감사 추적과 유사하게 일부 기존 실행 취소 프레임 워크를 사용할 수는 있지만 더 많을 수 있습니다. 헤비급 당신이 원하는 것보다. 명령 패턴을 기반으로하고 execute() 메소드를 구현할 것을 기대합니다. 다만 공백으로 둘 수 있다고 가정합니다.

0

거래 시스템은 보통 수준의 장비의 성능 저하를 용납하지 않는다. 특히 C++ 기반 시스템은 성능 향상을위한 디버깅의 용이성을 희생하는 경향이 있습니다. 그렇지 않으면 더 많은 회사가 Java/C#에서 그러한 시스템을 개발할 것입니다.

스택 추적을 C++에 도입하려는 시도는 피할 수 있습니다. 또한 어떤 방식 으로든 프로그램의 동작에 영향을 미치지 않는 방식 (예 : 스레딩 동작에 영향을 미침)으로 그러한 시스템을 도입 할 수 있다고 확신하지 못합니다.

프로그램에서 내부적으로 캡처하려고 시도하지 않고 외부 입력 (예 : 사용자 GUI 작업 및 메시지 트래픽)을 기록하는 것이 좋습니다. 이 경우 실패를 복제하고 디버깅 할 가능성이 더 큽니다.

현재 클라이언트와의 모든 네트워크 트래픽을 로깅하고 있습니까? 많은 FIX 기반 시스템은 규제 목적으로이를 기록합니다. I/O를 쉽게 기록 할 수 있습니까?

+0

예 로깅 및 크래시 덤프가 이미 있습니다. 스택 추적은 실제 스택 추적이 아니며 손으로 롤 버전이됩니다. 워크 플로우 전반에 걸쳐 발생하는 일에 관심이 있습니다. – Rich

0

자세한 정보가 포함 된 다른 (원형) 로그 파일을 만드는 것이 좋습니다. 이 파일은 다른 파일과 비교하여 기하 급수적으로 커지게됩니다.

또 다른 방법은 마지막 N 트랜잭션을 저장하는 것입니다. 트랜잭션 로그를 읽고 해당 데이터를 가상 응용 프로그램으로 보내는 프로그램을 작성하십시오. 이것은 원인을 만드는 데 도움이 될 수 있습니다.전에 임베디드 시스템에서이 기술을 사용했습니다.

+0

문제를 재현하기위한 또 다른 아이디어는 라이브 멀티 캐스트에서 서버로부터 전송 된 업데이트 메시지를 기록한 다음 별도의 멀티 캐스트로 클라이언트에 다시 재생하는 것입니다. 이것이 도움이되는지 아닌지는 분명치 않다. – Rich