【工作经历:阿里巴巴搜索技术研发中心QA ,百度新产品测试部QA】 【领域:测试分析,自动化测试,性能测试,安全测试 】 【个人定位:高级测试工程师+培训师+领域产品专家】

发布新日志

  • baiduhook框架

    2011-11-20 05:05:27

    baiduhook是一个优秀的linux下的hook框架,也是百度的同事贡献给业界的一个非常优秀的工具。
    百度很少开源自己的技术的,所以,对于这次的这种行为,是颇值得赞赏的。
    所以我在此处转载,希望可以让更多的人了解。

    这个框架的作用,就不大作介绍了。简单的,使用它,可以mock系统的任何函数。
    虚函数,非虚函数,共有,私有,以及系统函数等。

    这个方案里面,其实暗藏着一种c++单元测试领域的一个巨大创新。

    众所周知,googletest和googlemock都是非常优秀的,但是googlemock自身是有限制的,它要求在开发编写的代码中,必须使用虚函数,才可以使用googlemock。这样会给平常的c++单元测试带来一定阻碍。
    而使用baiduhook框架,就可以轻松的绕过google给我们的一个紧箍咒。


    代码示例


    请在文本框输入文字
    /***************************************************************************
     *
     * Copyright (c) 2011 Baidu.com, Inc. All Rights Reserved
     *
     **************************************************************************/
     
     

    #include <gtest/gtest.h>

    #include "mylib.h"

    #include "bhook.h"

    //隐含类指针参数需要在hook函数中显示定义
    int MyPublicSay(MyLib::Person *person)
    {
            int err;
            int ret = fault_fail("MyLib::Person::PublicSay", &err);
            if(ret == 0) {
                    printf("\e[33;1m[=HOOK=] this is no PublicSay!\n\e[m");
                    return err;
            }

            typedef int (*REAL_FUNC)(MyLib::Person *);
            REAL_FUNC old_func = (REAL_FUNC)get_real_func_lib("MyLib::Person::PublicSay");
            return old_func(person);
    }

    int MyPrivateSay(MyLib::Person *person)
    {
            int err;
            int ret = fault_fail("MyLib::Person::PrivateSay", &err);
            if(ret == 0) {
                    printf("\e[33;1m[=HOOK=] this is no PrivateSay!\n\e[m");
                    return err;
            }

            typedef int (*REAL_FUNC)(MyLib::Person *);
            REAL_FUNC old_func = (REAL_FUNC)get_real_func_lib("MyLib::Person::PrivateSay");
            return old_func(person);
    }

    TEST(Person, PublicSay)
    {
            //enable
            fault_enable("MyLib::Person::PublicSay", 100, -1);

            MyLib::Person * person = new MyLib::Person();

            int ret = person->PublicSay();

            EXPECT_EQ(0, ret);

            delete person;
    }

    TEST(Person, PrivateSay)
    {
            //enable
            fault_enable("MyLib::Person::PrivateSay", 100, -2);

            MyLib::Person * person = new MyLib::Person();

            int ret = person->Call();

            EXPECT_EQ(0, ret);

            delete person;
    }

    int  main(int  argc,  char  **argv) {
            testing::InitGoogleTest(&argc, argv);

            testing::GTEST_FLAG(color) = "yes";
            //attach func
            attach_func_lib("MyLib::Person::PublicSay", (void *)MyPublicSay);

            attach_func_lib("MyLib::Person::PrivateSay", (void *)MyPrivateSay);

            return RUN_ALL_TESTS();
    }



    感兴趣的同学可以去深入研究

    项目首页:http://code.google.com/p/baiduhook/

    官方的文档  http://code.google.com/p/baiduhook/wiki/Demos

    百度QA blog上的一个技术文章 
    http://hi.baidu.com/baiduqa/blog/item/454507494d1f6eeb82025c54.html
Open Toolbar