1

我在一个支持许多用户的全球交易系统上工作。每个用户都可以预订、修改、编辑、删除交易。该系统由中央交易捕获服务管理。交易捕获服务会通知所有用户发生的任何更新。

当我们发生崩溃时问题就来了,因为生产环境不可能在测试系统上重新创建,我不得不依赖崩溃转储和日志文件。

但是,这并不能告诉我用户一直在做什么。

我想要一个能够(在崩溃时)转储用户所做操作的历史记录的系统。我添加的任何内容都必须进入实时环境,因此不会对性能产生太大影响。

明智的想法我在每个函数的顶部考虑一个宏,它就像一个堆栈跟踪(只有我可以提供额外的用户信息,如交易 ID、用户对话选择等)。系统将记录堆栈跟踪(在每个线程基础)并将历史记录保存在循环缓冲区中(大小不同,具体取决于您想要捕获的历史记录量)。然后在崩溃时,我可以转储这个历史堆栈。

我真的很想知道是否有人有更好的解决方案,或者是否有人知道现有的框架?

谢谢丰富

4

3 回答 3

1

Your solution sounds pretty reasonable, though perhaps rather than relying on viewing your audit trail in the debugger you can trigger it being printed with atexit() handlers. Something as simple as a stack of strings that have __FILE__,__LINE__,pthread_self() in them migth be good enough

You could possibly use some existing undo framework, as its similar to an audit trail, but it's going to be more heavyweight than you want. It will likely be based on the command pattern and expect you to implement execute() methods, though I suppose you could just leave them blank.

于 2010-04-26T19:28:41.593 回答
0

交易系统通常不会受到该级别仪器的性能影响。尤其是基于 C++ 的系统,往往会为了性能而牺牲调试的便利性。否则,更多公司将使用 Java/C# 开发此类系统。

我会避免尝试将堆栈跟踪引入 C++。我也不相信您可以以不会以某种方式影响程序行为(例如,影响线程行为)的方式引入这样的系统。

恕我直言,最好记录外部输入(例如,用户 GUI 操作和消息流量),而不是尝试在程序内部捕获事物。在这种情况下,您可能有更好的机会复制故障并对其进行调试。

您当前是否正在记录所有进出客户端的网络流量?许多基于 FIX 的系统出于监管目的记录这一点。你能轻松地记录你的 I/O 吗?

于 2010-04-26T18:38:30.597 回答
0

I suggest creating another (circular) log file that contains your detailed information. Beware that this file will grow exponentially compared to other files.

Another method is to save the last N transactions. Write a program that reads the transaction log and feeds the data into your virtual application. This may help create the cause. I've used this technique with embedded systems before.

于 2010-04-26T19:39:48.817 回答