C++ 重播对共享对象的所有调用的最佳方法?

C++ 重播对共享对象的所有调用的最佳方法?,c++,debugging,testing,shared-libraries,ltrace,C++,Debugging,Testing,Shared Libraries,Ltrace,我维护一个用c/c++编写的共享对象。我希望能够记录对库的方法的所有调用,以便为调试和测试重播相同的方法调用序列 我可以使用ltrace来记录对库的所有调用,但我正在寻找一些工具或库来帮助重播跟踪。我基本上只需要解析跟踪,用相同的输入调用相同的函数,并对指针进行一些特殊处理。以下是经过筛选后的跟踪信息示例: 27105 sv_sxp_bfm_CreateSxpMemoryChannelBfm@libsxpbfmall.so(0x1397668, 1, 1, 15) = 0x1a53080 271

我维护一个用c/c++编写的共享对象。我希望能够记录对库的方法的所有调用,以便为调试和测试重播相同的方法调用序列


我可以使用ltrace来记录对库的所有调用,但我正在寻找一些工具或库来帮助重播跟踪。我基本上只需要解析跟踪,用相同的输入调用相同的函数,并对指针进行一些特殊处理。以下是经过筛选后的跟踪信息示例:

27105 sv_sxp_bfm_CreateSxpMemoryChannelBfm@libsxpbfmall.so(0x1397668, 1, 1, 15) = 0x1a53080
27105 sv_sxp_bfm_ConnectDPICallbacks@libsxpbfmall.so(0x1a53080, 0, 0x1a53080, 1) = 0x2aaaafe4918e
27105 sv_sxp_bfm_GetPhy@libsxpbfmall.so(0x1a53080, 0, 0x1a53080, 1) = 0x1a571a0
27105 sv_sxp_bfm_LoadRegisters@libsxpbfmall.so(0x1a53080, 0, 0x13bb3b0, 0x1a53080) = 6
27105 sv_sxp_bfm_ReadCfg@libsxpbfmall.so(0x1a53080, 0x13913d0, 0x1a53080, 0x13913d0) = 5
27105 sv_sxp_phy_SetTime@libsxpbfmall.so(0x1a571a0, 2500, 0x1a571a0, 2500) = 2500
27105 sv_sxp_phy_SetCLK@libsxpbfmall.so(0x1a571a0, 1, 0x1a571a0, 1) = 1
27105 sv_sxp_phy_SetRst@libsxpbfmall.so(0x1a571a0, 0, 0x1a571a0, 0) = 0
27105 sv_sxp_phy_SetCA@libsxpbfmall.so(0x1a571a0, 0, 0x1a571a0, 0) = 0
27105 sv_sxp_phy_SetSELIN@libsxpbfmall.so(0x1a571a0, 1, 0x1a571a0, 1) = 1

“并对指针进行一些特殊处理”——这就是问题所在。您不需要在日志中归档指向对象的所有状态吗?否则,如何构建对象以重播日志?该库是硬件的行为模型,因此它不指向任何外部对象。唯一的指针是指向模型的实例化本身,所有的输入和输出都是整数。好吧,那么一个简单的解析器来计算调用和参数,一个大的开关就可以了,不是吗?如果您想获得更多乐趣,boost::spirit可能是一个很好的第一个调用端口。感谢您提出使用boost::spirit进行解析的建议。关于使用一个巨大的switch语句,我也在考虑同样的问题,但我想我会问这个问题,看看是否有更优雅的方式。我想这样做会比我在谷歌上透露的更为普遍,但我想作为一个硬件模型,我的库在与外部类的交互方面实际上比大多数库要简单得多。“并对指针进行一些特殊处理”——这就是问题所在。您不需要在日志中归档指向对象的所有状态吗?否则,如何构建对象以重播日志?该库是硬件的行为模型,因此它不指向任何外部对象。唯一的指针是指向模型的实例化本身,所有的输入和输出都是整数。好吧,那么一个简单的解析器来计算调用和参数,一个大的开关就可以了,不是吗?如果您想获得更多乐趣,boost::spirit可能是一个很好的第一个调用端口。感谢您提出使用boost::spirit进行解析的建议。关于使用一个巨大的switch语句,我也在考虑同样的问题,但我想我会问这个问题,看看是否有更优雅的方式。我认为这样做会比我在谷歌上透露的更常见,但我想作为一个硬件模型,我的库实际上比大多数与外部类的交互要简单得多。