1

我是 C++ 单元测试的新手。我正在使用 googletest 对包含 linux 系统调用的源执行单元测试(并使用 gcovr 进行覆盖率报告)。为了测试它们,我想到了两种方法

1. 使用**LD_PRELOAD(通过存根自己的系统调用实现,例如写入、读取等)**

2. 使用 --wrap链接器选项将实际系统调用与我的存根实现包装起来。

由于使用的系统调用的数量更多(open,write,read,fseek,socket等),使用选项2几乎是不可行的,因此我想到了使用方法1。

但是,我无法使用方法 1 生成覆盖率报告(我确实使用 --coverage 选项编译了我的存根库)。当我看到 strace 时,它​​被锁定了。我不知道如何解决这个问题。所以我想保留系统调用而不是创建虚拟设备文件并处理它们。(例如:/sys/devices/system/cpu1/online --> /home/user/dummy/cpu/online)。

现在,我想模拟从写入系统调用到该文件的错误条件,但它似乎不起作用(例如,我已经使用 fcntl 函数设置了虚拟文件的 O_NONBLOCK 标志)。

我需要关于

1. 使用方法一,如何生成覆盖率报告?

2. 如果不能,如何设置虚拟文件与设备文件相同的属性。

只是我的代码的快照:openstub.c

#include <sys/types.h>
#include <sys/stat.h>

int open(const char *pathname, int flags, mode_t mode)
{
  if(mode ==1)
    {
      return 1;
    }
  else
    {
      return 0;
    }
}

使用open.c

#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
  char dummypath[]="dummypath";
  int filehandle;
  filehandle = open(dummypath,O_WRONLY);
  if(0>filehandle)
    printf("i am NOT using stubs\n");
  else if(filehandle ==1) {
    printf("I am using stub\n");
  }
  else
    {
      printf("I am using stub with Not the WRITE mode\n");
    }
}

编译命令:

gcc -shared -fPIC -ftest-coverage -fprofile-arcs openstub.c -o openstub.so

用于使用打开

gcc -ftest-coverage -fprofile-arcs -o usingopen usingopen.c

gcovr -f usingopen(这在 LD_PRELOAD 设置为 openstub.so 后卡住了)

谢谢你的建议!

4

0 回答 0