精华内容
下载资源
问答
  • 打桩代码函数

    2015-08-24 20:59:01
    打桩代码函数,c++版本的,希望对大家有帮助。
  • 打桩代码

    千次阅读 2020-04-07 14:07:25
    打桩代码1. 打桩 : 假设输出固定值2. 桩代码 : 1. 打桩 : 假设输出固定值 举个例子,中间有个求和函数,我假定它返回5,然后再对参数设置,进行验证结果是不是5 如:return 5; 调试结束后将桩代码删除 2. 桩...

    1. 打桩 : 假设输出固定值

    举个例子,中间有个求和函数,我假定它返回5,然后再对参数设置,进行验证结果是不是5
    如:return 5;
    调试结束后将桩代码删除

    2. 桩代码 :

    桩代码给出的实现是临时性的/待编辑的
    又能够使程序员可以暂时不编辑这段代码

    参考:
    https://blog.csdn.net/imjaron/article/details/78421119

    展开全文
  • 最后定位问题:copy之前代码时,变量名未修改,导致使用了未经定义的变量。 错误代码如下: @var roles = shiro.getUser().roleNames; var allRoles1 = ""; @for (role in roles) {allRoles = allRoles1 + "," +role...

    项目后管系统使用了beetl,上线后业务人员发现不能编辑审核员下拉框。最后定位问题:copy之前代码时,变量名未修改完全。
    错误代码如下:

    @var roles = shiro.getUser().roleNames; var allRoles1 = "";
    @for (role in roles) {allRoles = allRoles1 + "," +role;}
    @if (strutil.contain(allRoles,"超级管理员")==  true  ||
    @strutil.contain(allRoles,"部门管理员")==  true  || 
    @strutil.contain(allRoles,"对公开户管理员")==  true ){
    <input> ......</input>
    @} else {
    <input readonly="readonly">......</input>
    @}
    

    开发自测及测试人员测试时使用了admin账号,且admin账号有且仅有一个超级管理员角色,所以逻辑判断返回true,但是业务人员使用的账号还有一个审核员角色,且此角色刚好在最后一个…
    emm,经验教训自测及测试不用admin账号,并且cv大法用起来要仔细检查。
    简单的问题,恶心的解决过程,值得记录的是beetl中打桩方法:print()或者println()。

    展开全文
  • 打桩代码

    千次阅读 2014-01-16 15:48:24
    int a(){ //测试函数,打桩点 printf("this is a func !\n"); return 0; } int main(){ stubInfo si; setStub(a,stub,&si); a(); //此时会调用桩函数 cleanStub(&si); a(); }
    #include <sys/mman.h>
    #include <unistd.h>
    #include <string.h>
    #include <stdio.h>
    
    #define JMP_CMD	0xe9	//相对跳转指令 jmp xxx (总共长5个字节,后四个字节为地址)
    						//0xff 绝对跳转指令:FF 
    typedef struct stubInfo {
        void *funcAddr; //保存地址
    	unsigned char byteCode[5]; //保存地址对应的指令
    } stubInfo;
    
    static void setJumpCode(void *codeAddr, char jumpCode[5])
    {
       int pagesize = sysconf(_SC_PAGE_SIZE);//4096=0x1000
       if (mprotect((void*) ((unsigned long) codeAddr & (~(pagesize - 1))), pagesize, PROT_READ | PROT_WRITE | PROT_EXEC) != 0) {	//修改页面为可写
          return;
       }
       memcpy(codeAddr, jumpCode, 5);
    }
    
    void setStub(void *funcAddr, void *stubAddr, stubInfo *si)
    {
        char jumpCode[5] = {0xe9}; //跳转指令
        int  dist = stubAddr - funcAddr - 5;	//相对偏移
    
        memcpy((void *)&jumpCode[1], (void *)&dist, sizeof(void *));
        si->funcAddr = funcAddr; //保存原函数的地址
        memcpy((void *)&si->byteCode[0], (void *)funcAddr, 5);	//保存原地址处的指令
        
    	setJumpCode(funcAddr, jumpCode); //用跳转指令替换 原地址处的指令
    	//此函数相当于:
    	//*(char*)funcAddr=0xe9;
    	//*(int*)((char*)funcAddr+1)=stubAddr-funcAddr-5;
    }
    
    void cleanStub(stubInfo *si)
    {
        char   jumpCode[5]; //用来存放原地处的指令
        memcpy((void *)&jumpCode, (void *)&si->byteCode[0], 5);
        setJumpCode(si->funcAddr, jumpCode); //恢复原地址处的指令
    	//(省略了还原原地址所在页的保护属性)
    }
    例:
    int stub(){ //桩函数
            printf("this is stub func !\n");
            return 0;
    }
    
    int a(){  //测试函数,打桩点
            printf("this is a func !\n");
            return 0;
    }
    
    int main(){
            stubInfo si;
            setStub(a,stub,&si);
            a(); //此时会调用桩函数    
    	cleanStub(&si);
            a();  
    
    }
    


    展开全文
  • C语言的3种打桩方法总结

    千次阅读 2019-06-03 22:34:43
    前段时间项目组相对很久以前的工程做单元测试,由于比较久远内部逻辑复杂,外部依赖都比较多,所以想通过打桩的方式(不但要对外部接口还得可以对内部函数)进行函数级别的单元测试。调查了几个方法记录一下,以备...

            前段时间项目组相对很久以前的工程做单元测试,由于比较久远内部逻辑复杂,外部依赖都比较多,所以想通过打桩的方式(不但要对外部接口还得可以对内部函数)进行函数级别的单元测试。调查了几个方法记录一下,以备以后参照。

    • google的cmockery框架实现

           优点很多,请大家自行google。

            但cmockery不能对内部函数进行打桩,所以不满足我们要求。

    • 利用C编译器预编译的特点,通过宏定义实现

           利用C编译器的预编译特点,通过宏定义替换需要打桩的函数。直接上代码。

            main.c

    #include "test.h"
    
    // 把func1替换成func1_stub_行号
    #define func1 func1_(__LINE__)
    #define func1_(line) func1__(line)
    #define func1__(line) func1_stub_ ## line
    
    // 把func2替换成func2_stub_行号
    #define func2 func2_(__LINE__)
    #define func2_(line) func2__(line)
    #define func2__(line) func2_stub_ ## line
    
    //test函数中func1为第5行
    void func1_stub_5(void)
    {
        printf("func1_stub\n");
    }
    
    //test函数中func1为第6行
    void func2_stub_6(void)
    {
        printf("func2_stub\n");
    }
    
    int main()
    {
        test();
        return 0;
    }
    

    test.h

    #include <stdio.h>
    
    void test(void);
    void func1(void);
    void func2(void);
    

         test.c

    #include "test.h"
    
    void test(void)
    {
        func1();
        func2();
    }
    
    void func1(void)
    {
        printf("func1()\n");
    }
    void func2(void)
    {
        printf("func2()\n");
    }
    • 修改函数内存地址,通过Jump指令跳转到stub函数

         第一种

    demo.c

    #include <stdio.h>
    #include <stdint.h>
    #include <sys/mman.h>
    #include <unistd.h>
    
    void bar()
    {
            printf("function bar\n");
    }
    
    void foo()
    {
            printf("function foo\n");
    }
    
    void monkey_patch(void* old_function, void* new_function)
    {
            void* page;
    
            page = (void*)((uint64_t)old_function & ~(getpagesize()-1));
            if(mprotect(page, getpagesize(), PROT_WRITE|PROT_READ|PROT_EXEC)) {
                    perror("mprotect");
            }
            ((uint8_t*)old_function)[0] = 0xeb; /* jmp */
            /*
             * Number of bytes to jump relative to the eip which is 2 bytes past
             * the address of this instruction. Cannot jump more than 128 bytes.
             */
            ((uint8_t*)old_function)[1] = new_function - old_function - 2;
    }
    
    int main()
    {
            foo();
            monkey_patch(foo, bar);
            foo();
    
        return 0;
    }

          第二种

          stub.h    

    #ifndef __STUB_H__
    #define __STUB_H__
    
    #ifdef __cplusplus
    exern "C"
    {
    #endif
    
    #define CODESIZE 5U
    
    struct func_stub
    {
        void *fn;
        unsigned char code_buf[CODESIZE];
    };
    
    int stub_init();
    void stub_set(struct func_stub *pstub, void *fn, void *fn_stub);
    void stub_reset(struct func_stub *pstub);
    
    #ifdef __cplusplus
    }
    #endif
    
    #endif

         stub.c   

    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <memory.h>
    #include <errno.h>
    #include <limits.h>
    #include <sys/mman.h>
    
    #include "stub.h"
    
    static long pagesize = -1;
    
    static inline void *pageof(const void* p)
    {
            return (void *)((unsigned long)p & ~(pagesize - 1));
    }
    
    void stub_set(struct func_stub *pstub, void *fn, void *fn_stub)
    {
        pstub->fn = fn;
        memcpy(pstub->code_buf, fn, CODESIZE);
    
        if (-1 == mprotect(pageof(fn), pagesize * 2, PROT_READ | PROT_WRITE | PROT_EXEC))
        {
            perror("mprotect to w+r+x faild");
            exit(errno);
        }
    
            *(unsigned char *)fn = (unsigned char)0xE9;
        *(unsigned int *)((unsigned char *)fn + 1) = (unsigned char *)fn_stub - (unsigned char *)fn - CODESIZE;
    
        if (-1 == mprotect(pageof(fn), pagesize * 2, PROT_READ | PROT_EXEC))
        {
            perror("mprotect to r+x failed");
            exit(errno);
        }
    
        return;
    }
    
    void stub_reset(struct func_stub *pstub)
    {
        if (NULL == pstub->fn)
        {
                    return;
        }
    
        if (-1 == mprotect(pageof(pstub->fn), pagesize * 2, PROT_READ | PROT_WRITE | PROT_EXEC))
        {
            perror("mprotect to w+r+x faild");
            exit(errno);
        }
    
            memcpy(pstub->fn, pstub->code_buf, CODESIZE);
    
        if (-1 == mprotect(pageof(pstub->fn), pagesize * 2, PROT_READ | PROT_EXEC))
        {
            perror("mprotect to r+x failed");
            exit(errno);
        }
    
            memset(pstub, 0, sizeof(struct func_stub));
    
        return;
    }
    
    int stub_init(void)
    {
            int ret;
    
            pagesize = sysconf(_SC_PAGE_SIZE);
    
            ret = 0;
            if (pagesize < 0)
            {
                    perror("get system _SC_PAGE_SIZE configure failed");
                    ret = -1;
            }
    
            return ret;
    }

        main.c

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    #include "stub.h"
    
    void f1()
    {
        printf("f1\n");
    
        return;
    }
    
    void f2()
    {
        printf("f2\n");
    
        return;
    }
    
    void *_memset(void *s, int ch, size_t n)
    {
        printf("-memset\n");
    
        return s;
    }
    
    int main()
    {
        char ac[10] = {1};
        struct func_stub stub;
    
            if (-1 == stub_init())
            {
                    printf("faild to init stub\n");
                    return 0;
            }
    
        stub_set(&stub, (void *)memset, (void *)_memset);
    
        memset(ac, 0, 10);
    
            stub_reset(&stub);
    
        memset(ac, 0, 10);
        printf("ac[0] = %hhu\n", ac[0]);
    
            stub_set(&stub, (void *)f1, (void *)f2);
    
            f1();
    
            stub_reset(&stub);
    
            f1();
    
            return 0;
    }

     

    展开全文
  • C++打桩测试

    2020-03-27 19:04:22
    一 问题的产生 ...需要进行"打桩",举一个具体的例子 class DataGetter { public: ool Run(); … private: … Client* m_ptr_client; … }; …… …… bool DataGetter::Run() { … std::string da...
  • 什么是单元测试中的打桩

    千次阅读 2020-12-23 23:05:32
    打桩就是编写或生成桩代码打桩的目的 打桩的目的主要有:隔离、补齐、控制。 隔离是指将测试任务从产品项目中分离出来,使之能够独立编译、链接,并独立运行。隔离的基本方法就是打桩,将测试任务之外的,并且...
  • 介绍了UT测试框架及动态打桩技术,并配有相关源代码工程,方便开发人员进行代码自测试。
  • 单元测试,打桩问题

    千次阅读 2019-08-01 19:54:21
    先说一下我的问题,一直在做的程序没有单元测试的代码,现在希望增加单元测试功能。考察了一些平台和技术,记录一下。 我的程序的结构如下 程序包含a,b两个dll,其中b依赖a。现在希望对b进行单元测试。 a.dll的...
  • 代码stub 打桩

    千次阅读 2017-06-16 16:16:25
    stub code大概就是占坑的代码,桩代码给出的实现是临时性的/待编辑的。它使得程序在结构上能够符合标准,又能够使程序员可以暂时不编辑这段代码。 举个《C专家编程》中的例子: 我的一位同事需要编写一个程序,...
  • 认识单元测试中的打桩

    万次阅读 2012-11-16 10:27:16
    打桩就是编写或生成桩代码。  打桩的目的  打桩的目的主要有:隔离、补齐、控制。  隔离是指将测试任务从产品项目中分离出来,使之能够独立编译、链接,并独立运行。隔离的基本方法就是打桩,将测试任务之外的...
  • 有时单元测试的时候,遇到系统函数,也需要进行打桩,来完成测试。 我们这次来讲解如何 对系统函数memcpy进行打桩。 使用ctestcode工具 ,系统函数打桩只需要做如下的设置,这样memcpy的桩就设置好了 [auto_mock] ...
  • 代码实验室: C语言函数打桩练习 程序员最经常遇见的问题,队友接口定义好的了,但还没有实现。 而你的代码deadline已经快到了。在这样的情况下,应该怎样去测试代码呢,按时交货呢? 接下来,我们将示范 如何使用...
  • “偷梁换柱”的库打桩机制

    千次阅读 2019-08-01 12:42:10
    前言 假如由于调试需要,你希望原先代码中的malloc函数更换...LInux链接器有强大的库打桩机制,它允许你对共享库的代码进行截取,从而执行自己的代码。而为了调试,你通常可以在自己的代码中加入一些调试信息,例如...
  • 那种方法的缺陷太多,平常写代码一般不会那样去写,今天我们在之前的基础上稍微进一步演进,引入stub的概念,stub在rpc里面是代理的意思,是个约定俗成的东西,所以不叫proxy,知道是这么个东西就行了。代理是干嘛的...
  • Linux C 动态打桩实现

    2014-08-01 23:17:28
    C语言UT单元测试中需要实现动态,本代码实现了该功能,原理和网络上的描述一样,通过修改机器指令实现。 平台是Linux
  • c语言环境下也出现了开发源码的白盒测试用例CUnit。CUnit以静态库的形式提供给用户使用,用户编写程序的时候直接链接此静态库就可以了。它提供了一个简单的单元测试框架,并且为常用的数据类型提供了丰富的断言语句...
  • 单元测试中的打桩技术

    万次阅读 2018-07-01 21:22:53
    打桩就是编写或生成桩代码。二、打桩的用途打桩的目的主要有:隔离、补齐、控制。①隔离是指将测试任务从产品项目中分离出来,使之能够独立编译、链接,并独立运行。隔离的基本方法就是打桩,将测试任务之外的,并且...
  • 代码覆盖率

    千次阅读 2018-02-11 13:06:47
    用途:测试覆盖率评价的是测试代码的质量,并不是产品代码的质量代码覆盖率是一种白盒测试,因为测试覆盖率是评价产品代码类内部的指标,而不是评价系统接口或规约。测试覆盖率尤其用于评价测试代码是否已经覆盖了...
  • 静态的就是在写测试代码之前根据需要打桩的类生成另外一个类,这个类就是mock object。动态的就是mock object是在测试代码运行的时候才生成的。所以很明显,动态打桩比静态打桩要方便地多。本章就是介绍动态打桩的...
  • 测试开发笔记

    万次阅读 多人点赞 2019-11-14 17:11:58
    沟通 在测试前期与开发沟通 确认测试重点 确认测试的优先级 了解开发人员技术和业务背景 业务水平 技术水平 代码质量 人员流动性 在测试结束后 对已发现的bug进行统计 知道高发概率bug 在新项目中要进行重点测试 ...
  • linux中的库打桩机制 库打桩(library interpositioning):简单的说就是要自己的函数替换库中相应的函数。比如我们想知道程序总共调用了多少次malloc().在程序已经写好的情况下,库打桩测试是一个很好的方式。使用打桩...
  • 这里做下简单的背景介绍,打桩的概念:可以先去看下先去的文章:https://blog.csdn.net/anranjingsi/article/details/106084223 前面也使用过gtest+gmock框架给C/C++做单元测试,但gmock的使用有着明显的限制:1)...
  • linux库打桩技术

    2019-09-24 10:40:14
    而代之执行 自己的代码。使用打桩机制,你可以追踪对某个特殊库函数的调用次数,验证和追踪它的输入和输出值,甚至把它替换成一个完全不同的实现。 下面是它的基本思想:给定一个需要打桩的目标函数,创建一个包装...
  • cpp-stub 开源代码

    2021-02-04 19:16:51
    这是一个单元测试打桩开源代码,在git上下载的代码在ARM平台上有一个BUG,使用stub.h中的reset方法时,会引起段错误,该资源对这个bug进行了修复。
  • 一文搞懂linux的库打桩

    千次阅读 2020-03-19 19:33:48
    Linux下的链接器支持一个强大的库打桩(library interpositioning),允许你拦截对系统标准库中某个目标函数的调用,取而代之执行自己的...打桩可以发生在编译,链接和运行的任意一个阶段,相应的代码编写和编译也...
  • 打桩机制

    千次阅读 2017-10-25 17:51:59
    打桩允许你截获对共享库的调用,取而代之执行自己的代码。 使用这种机制可以追踪对某个函数库的调用次数,验证和追踪它的输入输出值,甚至直接换成一个完全不同的实现。 给一个需要打桩的目标函数创建一个包装...
  • C语言之简单的函数打桩

    千次阅读 2020-02-13 05:07:17
    废话不必多说,代码实现: 定义头文件demo.h #pragma once //防止头文件重复 #ifdef __cplusplus //按照C标准,兼容C++编译器。 extern"C" { #endif //初始化环境 int socketclient_init(void **handle); //....
  • Linux C 库打桩技术

    2020-05-11 23:21:11
    编译时打桩3.1.相关文件3.1.1.main.c3.1.2.newcalloc.h3.1.3.newcalloc.c3.2.编译命令3.3.运行情况和运行命令3.4.说明4.编译时打桩4.1.相关文件4.1.1.main.c4.1.2.newcalloc.c4.2.编译命令和运行命令4.3.运行情况4.4...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,590
精华内容 1,036
关键字:

代码打桩