Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在C++;_C++_Workflow_Debugging_Trading - Fatal编程技术网

C++ 如何在C++;

C++ 如何在C++;,c++,workflow,debugging,trading,C++,Workflow,Debugging,Trading,我在一个支持许多用户的全球交易系统上工作。每个用户都可以预订、修改、编辑、删除交易。该系统由中央交易捕获服务管理。交易捕获服务通知所有用户发生的任何更新 当我们发生崩溃时,问题就来了,因为生产环境不可能在测试系统上重新创建,所以我不得不依赖崩溃转储和日志文件 但是,这并没有告诉我用户一直在做什么 我想要一个系统,可以(在崩溃时)转储用户所做事情的历史记录。我添加的任何内容都必须进入实时环境,因此不会对性能产生太大影响 想法方面,我考虑在每个函数的顶部设置一个宏,其作用类似于堆栈跟踪(只有我可以提

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

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

但是,这并没有告诉我用户一直在做什么

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

想法方面,我考虑在每个函数的顶部设置一个宏,其作用类似于堆栈跟踪(只有我可以提供额外的用户信息,如交易id、用户对话框选择等)。系统将记录堆栈跟踪(基于每个线程),并在循环缓冲区中保留历史记录(大小不同,取决于您想要捕获的历史记录数量)。然后在崩溃时,我可以转储此历史记录堆栈

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

谢谢
交易系统通常不遭受这种级别的仪器性能的冲击,尤其是基于C++的系统往往牺牲了调试的性能,否则,更多的公司会在爪哇/C中开发这样的系统。 <>我会避免尝试将堆栈跟踪引入C++中。我也不相信你可以以这样的方式引入这样一个系统,它不会以某种方式影响程序的行为(例如,影响线程行为)。 IMHO,最好记录外部输入(例如,用户GUI操作和消息流量),而不是尝试在程序内部捕获内容。在这种情况下,您可能有更好的机会复制故障并对其进行调试


<> P>你是否正在记录所有的网络流量到客户机?许多基于FIX的系统记录了这一点,为了便于管理。你能很容易地记录I/O?

< P>交易系统通常不遭受该级别的仪器的性能冲击。C++系统特别是牺牲了调试性能的便利性。herwise说,更多的公司将用Java/C开发这样的系统

<>我会避免尝试将堆栈跟踪引入C++中。我也不相信你可以以这样的方式引入这样一个系统,它不会以某种方式影响程序的行为(例如,影响线程行为)。 IMHO,最好记录外部输入(例如,用户GUI操作和消息流量),而不是尝试在程序内部捕获内容。在这种情况下,您可能有更好的机会复制故障并对其进行调试


您当前是否正在记录客户端的所有网络流量?许多基于修复程序的系统记录这些流量是出于监管目的。您可以轻松记录I/O吗?

您的解决方案听起来很合理,但您可能不依赖于在调试器中查看您的审核跟踪,而是可以触发使用atexit()打印它一些简单的东西,比如一堆字符串,其中包含_FILE _uuu、_LINE uuu、pthread_self(),可能就足够了


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

您的解决方案听起来很合理,但您可能不需要依赖于在调试器中查看您的审计跟踪,而是可以使用atexit()处理程序将其打印出来在他们身上也许足够好


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

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


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

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


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

请不要使用宏。否则,我如何确保在不再需要它时将其删除?#ifdefs?p拜托,不要使用宏。否则我如何确保在我不再需要它时将其删除?#ifdefs?是的,我已经有了日志记录和崩溃转储。堆栈跟踪不会是真正的堆栈跟踪,它将是手动版本。因为我对整个工作流中发生的事情感兴趣。是的,我已经有了日志记录和崩溃转储tack trace不是一个真正的堆栈跟踪,它应该是一个手动版本。因为我对整个工作流中发生的事情很感兴趣。我重新创建问题的另一个想法是在实时多播上记录从服务器发送的更新消息,然后在单独的多播上播放给我的客户端。我不确定这是否会发生我的另一个重新制造这个问题的想法是r