2

我已经使用 GDB Python 接口为(C)结构编写了一个漂亮的打印机,该结构倾向于在软件版本之间发生变化。由于格式在波动,我试图使打印机具有足够的动态以适应并总是尝试打印有用的东西而不是抛出 Python 异常。

目前我需要支持两种主要格式,但未来可能还会支持更多。我想为打印机编写一些单元测试,以避免必须手动加载来自不同版本的 coredump 来测试它。

我想也许我可以从调试会话中序列化 gdb.Value 并将它们加载到我的单元测试中,但我无法做到(pickle 不适用于 gdb.Value)。核心转储非常大,因此无法使用漂亮的打印机和脚本 GDB 存储它们以进行测试。

如何在不保留大量核心转储的情况下对漂亮的打印机进行单元测试?

4

1 回答 1

2

如何在不保留大量核心转储的情况下对漂亮的打印机进行单元测试?

保留小核心转储:-)

假设您struct Foo有一台漂亮的打印机,并且在不同版本之间不断变化。

编译以下程序:

#include <stdlib.h>
#include "foo.h"
int main()
{
   struct Foo f;
   // initialize f with some values
   abort();
}

编译并运行该程序,将其和生成的核心存储为foo-v2and foo-v2.core(假设您现在使用 2 的版本struct Foo)。核心应该很小。

现在结帐foo.h对应于版本 1 的struct Foo版本控制系统(您确实使用了版本控制系统,对吗?)。重建并重新运行程序,将其存储foo-v1foo-v1.core.

现在,对于每个版本,您只需要重新构建/重新运行上述程序,并将 GDB 漂亮打印机的输出与预期结果进行比较。如果它仍然可以正常工作,你就完成了。如果没有,struct Foo一定是已经改变了,你需要更新你的漂亮打印机。

将新的二进制文件和核心保存为foo-v3and foo-v3.core,更新漂亮的打印机,然后针对所有foo-vNfoo-vN.core对进行测试(对于测试本身,使用 GDB 源代码附带的 GDB 单元测试框架)。

于 2012-10-13T06:07:16.793 回答