我使用 GDB Python 接口(interface)为 (C) 结构编写了一个 pretty-print ,该结构在软件版本之间有变化的趋势。由于格式在波动,我尝试使打印机动态化以适应并始终尝试打印有用的东西而不是抛出 Python 异常。
目前我需要支持两种主要格式,但将来可能会支持更多格式。我想为打印机编写一些单元测试,以避免必须手动加载来自不同版本的核心转储来测试它。
我想也许我可以从调试 session 中序列化 gdb.Value 并将它们加载到我的单元测试中,但我无法做到(pickle 不适用于 gdb.Value)。核心转储非常大,因此将它们与用于测试的 pretty-print 和脚本 GDB 一起存储不是一种选择。
如何在不保留大量核心转储的情况下对 pretty-print 进行单元测试?
最佳答案
How can I unit-test my pretty printer without keeping huge core-dumps around?
保留小的核心转储 :-)
假设您有 struct Foo
,您有一个 pretty-print ,并且在不同版本之间不断变化。
编译以下程序:
#include <stdlib.h>
#include "foo.h"
int main()
{
struct Foo f;
// initialize f with some values
abort();
}
编译并运行该程序,将其和生成的核心存储为 foo-v2
和 foo-v2.core
(假设您现在使用的是 结构 Foo
)。核心应该很小。
现在从您的版本控制系统中 check out 与 struct Foo
版本 1 相对应的 foo.h
(您确实使用了版本控制系统, 正确的?)。重建并重新运行程序,将其存储为 foo-v1
和 foo-v1.core
。
现在,对于每个版本,您只需重建/重新运行上面的程序,并将 GDB pretty-print 的输出与预期结果进行比较。如果它仍然工作正常,你就完成了。如果不是,struct Foo
一定已经更改,您需要更新您的 pretty 打印机。
将新的二进制文件和核心保存为foo-v3
和foo-v3.core
,更新 pretty-print ,然后针对所有foo-vN 进行测试
和 foo-vN.core
对(对于测试本身,使用 GDB 源附带的 GDB 单元测试框架)。
关于python - 我如何对用 Python 编写的 GDB pretty-print 进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12870256/