如何重播多线程应用程序?

时间:2012-05-01 20:42:04

标签: c linux gcc x86-64 glibc

我想记录同步操作,例如锁,sempahores,多线程应用程序的障碍,以便我可以稍后重放录制的应用程序,以便进行调试。

在途中是提供你自己的锁,sempaphore,条件变量等..也做日志记录的功能,但我认为这是一种矫枉过正,因为它们必须使用一些常见的同步操作。

所以我的问题是我应该记录哪些同步操作,以便我对程序进行最少的修改。换句话说,构建所有这些同步操作的glibc和系统调用中的函数或宏是什么?所以我只修改那些用于记录和重放。

3 个答案:

答案 0 :(得分:1)

在您的情况下,一种有效的方法"记录" Linux上的系统调用可能是使用LD_PRELOAD技巧,并使用您自己的调用版本覆盖实际的系统调用,这些调用将记录调用的使用,然后转发到实际的系统调用。

给出了一个更广泛的例子here in Linux Journal

正如你在这些链接中看到的那样,"技巧的基本要点"是你可以让系统在任何其他系统库(如pthreads等)之前加载你自己的动态库,然后通过将这些函数的自己版本作为优先级来掩盖对这些库函数的调用。然后,您可以在您的覆盖功能中记录原始功能的使用,并将参数传递给您尝试记录的实际呼叫。

关于这个方法的好处是它几乎可以捕获你可以进行的任何调用,这个函数完全保留在用户区中,以及一个可以调用内核的函数。

答案 1 :(得分:1)

我能想到的最好的方法是在“记录”模式下使用gdb进行调试:

根据此页面:GDB Process Record线程支持正在进行中,但可能尚未完成。


不太严格地回答你的问题,我可以建议

在其他平台上,存在其他几个线程检查程序,但我对它们没有多少经验。

答案 2 :(得分:1)

因此GDB记录模式不支持多线程,但是RR记录/重放系统绝对支持:https://rr-project.org/

对于具有较少技术限制的商业解决方案,还有UDB:https://undo.io/solutions/

我从事调试器工作已经有几年了,从我所看到的情况来看,由于上述原因和其他原因(例如,速度慢和内存需求大),GDB记录+重放功能实际上还没准备好在黄金时段准备。 / p>

如果您可以使其在开发环境中正常工作,则记录+重放/可逆调试可能会大大改变您的工作流程;我希望您找到一种利用它的方法。