本主题说明如何提供 C/C++test 在构建测试对象/测试可执行文件时可以使用的外部符号列表(在用户或系统库中定义)——如果 C/C++test 的库符号标识(LSI)无法自动获取这些符号。这是某些嵌入式单元测试场景中(例如为 Wind River 的 VxWorks 构建 DKM 测试对象)最可行的解决方案。如果您在 LSI 阶段遇到自动库识别或符号提取问题,这也是一个很好的解决方法。 

章节目录:

外部符号列表格式

外部符号列表是一个类似于 XML 的文件,它将符号列表包装在 LSI 可以理解的结构中。该文件的格式如下:

<?xml version="1.0" encoding="UTF-8"?>
<LibrarySymbols tool="C++Test" formatVersion="1.0">
	   <Symbol name="some_symbol"/>
   <!-- ... --> 
</LibrarySymbols>

所有符号名称都必须根据为单元测试选择的编译器使用的修饰方案进行修饰。

获取外部符号列表

获取外部符号列表的具体过程会因操作系统、命令 shell 以及可用实用程序等因素而异。获取外部符号列表的所有方法一般包括:

  • 从相应的对象/库/镜像中转储符号名称。如果编译器输出具有通用对象格式,则可以使用操作系统的默认二进制实用程序(类似 nm)来完成。更常见的情况是,需要使用编译器提供的适当实用程序。
  • 仅从转储中过滤出定义的全局符号名称。必须过滤掉本地或未定义符号、符号地址、符号类型代码字符、源对象/库名称等。如果可用,这可以通过 nm 工具自带的选项来完成。
  • 将过滤后的符号名称列表包装在外部符号列表格式中描述的类似 XML 的结构中。

由于没有适用于所有情况的单一方法,因此您需要根据情况确定最佳方法。为了帮助您完成此外部符号列表生成过程,C++test 提供了 LSISymLstGen Java 应用程序(源代码和编译后的二进制文件),它从类似 nm 的工具输出中生成 LSI 的符号列表。此输出必须是 BSD 格式('nm' 的默认格式)或通用 POSIX(可移植性)格式('nm’和 'LSISymLstGen' 的 -P 选项)。该应用程序位于 <CPPTEST_INSTALL_DIR>/bin/engine/utils 目录中。

要创建符号列表,可参考以下示例命令:

  • nm_tool -g -p --defined-only --no-demangle object_file > nm_out
  • java -cp "<CPPTEST_INSTALL_DIR>/bin/engine/utils" LSISymLstGen nm_out XML_sym_lst

此外,C/C++test 提供了“Extract library symbols”测试流程方法(运行上述命令)以及“Utilities> Extract Library Symbols”测试配置。使用前必须编辑该方法。在大多数情况下,只需将“Path to external library/object to scan for symbols”测试流属性设置为对象/库/镜像的路径即可。不过,您可能还想调整“Symbols listing tool name”(某些情况下需要,例如针对 Wind River 的解决方案)以及“Symbols listing options”。 

默认情况下,配置将尝试在 C/C++test 的缓存中为您的项目创建符号列表。这样,每次清除项目的缓存时,都必须重新创建列表。调整“Path to generated file with symbols”,为多个项目提供同一个符号列表或许更方便——或者只是为了在清除缓存时不删除该列表。

如果需要调整 JRE 可执行文件的路径,可以修改测试流程方法中的“jre”属性。

如需了解如何编辑/调整测试流程方法,请参阅自定义测试执行流程

自定义测试流程方法以加载外部符号列表

要将 C/C++test 配置为在构建测试对象/可执行文件时使用符号列表,您需要修改相应的方法(即您使用的测试配置中调用的方法)。唯一需要修改的是将 libSymFile 属性添加到 LsiStep 标签。示例:<LsiStep libSymFile="XML_sym_lst" />

针对 Wind River 的 DKM 提供的许多测试流程方法(与相应的测试配置结合)都将外部符号列表作为 VxWorks 镜像的符号源。为使用外部符号列表自动生成桩函数专门提供了一种测试配置:“Utilities> Generate Stubs Using External Library Symbols”。 

默认情况下,这些测试配置将在 C++test 项目的缓存中搜索外部符号列表。要更改此设置,您可以调整“Path to file with external symbols list”测试流程属性。 

  • No labels