如何在C ++中获得调试执行流程

时间:2010-04-26 18:28:51

标签: c++ workflow debugging trading

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

当我们崩溃时问题就出现了,因为生产环境无法在测试系统上重新创建,我必须依赖崩溃转储和日志文件。

然而,这并没有告诉我用户做了什么。

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

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

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

由于 富

3 个答案:

答案 0 :(得分:1)

您的解决方案听起来很合理,但可能不是依赖于在调试器中查看审计跟踪,而是可以使用atexit()处理程序触发它。像一堆字符串那样简单的东西,其中__FILE __,__ LINE __,pthread_self()在其中是很好的

你可能会使用一些现有的撤销框架,因为它类似于审计跟踪,但它会比你想要的更重量级。它可能基于命令模式并期望您实现execute()方法,但我想您可以将它们留空。

答案 1 :(得分:0)

交易系统通常不会遭受该级别仪器的性能损失。特别是基于C ++的系统往往会牺牲性能调试的简易性。否则,更多公司将在Java / C#中开发此类系统。

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

恕我直言,可能更愿意记录外部输入(例如,用户GUI操作和消息流量),而不是尝试在程序内部捕获内容。在这种情况下,您可能更有可能复制失败并进行调试。

您当前是否正在记录客户端的所有网络流量?许多基于FIX的系统将其记录为监管目的。你能轻松登录你的I / O吗?

答案 2 :(得分:0)

我建议创建另一个(循环)日志文件,其中包含您的详细信息。请注意,与其他文件相比,此文件将呈指数级增长。

另一种方法是保存最后的 N 事务。编写一个程序,读取事务日志并将数据提供给虚拟应用程序。这可能有助于创造原因。我以前在嵌入式系统中使用过这种技术。