首页
学习
活动
专区
圈层
工具
发布

linux 链接器 库打桩

@(linux 编程) 翻看 CSAPP 看到库函数打桩,记录下。...linux 链接器支持库打桩(library interpositioning), 允许我们截获共享库的调用,执行自己的代码,通过这个机制,可以给程序调试带来很多便利。...库打桩实现有三种: 编译时打桩 链接时打桩 运行时打桩 以下,参照书中例子,以 malloc 和 free 两个库函数的调用作为例子, 添加调用该函数时打印调试信息,以上述提到的三种方式实现打桩 ubuntu...以上两种需要有源文件的情况下实现,而对于运行时打桩,只需要可以访问执行文件,利用动态链接器的LD_PRELOAD环境变量实现。.../out; unset LD_PRELOAD ## 其他任何的可执行程序都可以打桩 export LD_PRELOAD=".

1.9K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Java 软件测试(三):Mockito打桩与静态方法模拟解析

    它提供了两种核心的模拟技术:打桩(Stubbing)和Mock静态方法。这两个技术看起来相似,但实际应用场景却大不相同。1. 打桩技术详解1.1 什么是打桩打桩说白了就是给Mock对象"预设台词"。...两种技术的区别与选择3.1 核心差异打桩和Mock静态方法最大的区别在于作用范围。打桩只影响你创建的那个Mock对象,其他地方的调用不受影响。而Mock静态方法是全局的,会影响所有对该静态方法的调用。...// 打桩 - 只影响这个mock对象UserService mockUserService = mock(UserService.class);when(mockUserService.getUser...总计什么时候用打桩打桩适合处理那些你能控制的依赖对象。比如DAO层、Service层的依赖,或者一些业务组件。这些对象通常是通过依赖注入传入的,你可以很容易地用Mock对象替换它们。...InsufficientStockException.class, () -> { orderProcessor.processOrder(request); });}Mockito的打桩和

    68120

    “偷梁换柱”的库打桩机制

    打桩机制 LInux链接器有强大的库打桩机制,它允许你对共享库的代码进行截取,从而执行自己的代码。而为了调试,你通常可以在自己的代码中加入一些调试信息,例如,调用次数,打印信息,调用时间等等。...本文将介绍三种打桩机制,分别在编译的不同阶段。如果你还不了解这几个阶段,建议你阅读《hello程序是如何变成可执行文件的》。 编译时打桩 编译时打桩在源代码级别进行替换。...链接时打桩 顾名思义,链接时打桩是在链接时替换需要的函数。Linux链接器支持用--wrap,f的方式来进行打桩,链接时符号f解析成__wrap_f,还会把__real_f解析成f。什么意思呢?...来源:公众号【编程珠玑】 网站:https://www.yanbinghu.com 运行时打桩 前面两种打桩方式,一种需要访问源代码,另外一种至少要访问可重定位文件。可运行时打桩没有这么多要求。...但是,需要特别注意的是,采用最后一种方式打桩时,最好避免打桩函数内部还调用了打桩函数,这样会导致难以预料的后果,另外由于这种打桩机制对所有程序都有效,因此也非常危险,需要特别注意。

    1.7K20

    Go 代码测试时怎么打桩?给大家写了几个常用案例

    gomonkey 是 Go 生态中的一个测试打桩框架,它能在单元测试中给函数,导出方法,私有方法,接口,函数参数,全局变量等进行打桩,覆盖的场景很全。...今天我们就来一起看几个典型的例子熟悉它的用法 常用打桩案例 使用前我们还是用 go get 在项目中添加一下依赖: go get github.com/agiledragon/gomonkey/v2@v2.11.0...所以保险起见在执行测试 case 像下面这样加上gcflags go test -gcflags=all=-l 函数打桩 给函数打桩是最常见的场景,ApplyFunc 接口定义如下: func ApplyFunc...方法打桩 除了给函数打桩,我们还能用 ApplyMethod 给方法打桩。...gomonkey还支持给包内未导出的函数和方法打桩,这就让单元测试变的很方便,不需要为了写测试把包的所有函数和方法都定义成大写开头的公共方法。

    62010

    基于Jacoco的三种增量覆盖率统计方法

    而减法执行的时机,可以是上图 中的多个节点,即 1)在 agent 打桩时只针对增量部分进行打桩,或者是在全量覆盖率统计完成后,将生成的 jacoco.exec 覆盖率文件解析 2)生成可读的覆盖率统计报告的环节进行增量计算...类似的,可以通过includes 参数来只针对指定的类和方法进行打桩。...这是增量覆盖率统计的技术基础,原理是在 jacoco 进行打桩时,结合 git-diff 产生的增量清单作为 includes 的入参,让 jacoco 只针对指定的需要进行覆盖率统计的代码进行打桩,也就是只针对增量代码进行打桩...当然,这个方案中,由于修改了打桩范围的原因,不能同时生成全量和增量的覆盖率结果,需要分两次执行。...这个工具原先主要用于分析 C++覆盖率统计报告,经过笔者提的需求之后,已经支持了对 jacoco 报告的解析从而可以用于 Java项目的增量覆盖率统计。

    2.1K11

    快速学会Springboot中编写Mock单元测试

    java开发者开发接口往往忽视接口单元测试。作为java开发如果会Mock单元测试,那么你的bug量将会大大降低。...AssertJ: 一个java断言库,提供测试断言支持. Hamcrest: 对象匹配断言和约束组件. Mockito: 知名 Java mock 模拟框架....5.测试打桩 有个很常见的情形,在开发中有可能你调用的其他服务没有开发完,比如你有个短信发送接口还在办理短信接口手续,但是你还需要短信接口来进行测试。...这种模拟也被成为测试打桩。...这里我们会用到Mockito 测试场景描述如下: 指定打桩对象的返回值 判断某个打桩对象的某个方法被调用及调用的次数 指定打桩对象抛出某个特定异常 一般有以下几种组合: do/when:包括doThrow

    7.7K10

    Go语言单元测试

    1. monkey打桩测试最近遇到一种编码场景,我需要对一个库函数进行测试,但是这个函数的调用可能会影响现网数据,因此需要做一点欺骗。...monkey就是一种常见的单元测试打桩测试工具,给我的感觉有点像Java的动态代理AOP,直接将函数在运行时注入,实现动态的函数,使得目标函数或者方法逻辑跳转到桩实现上。...下面的代码是这样一种场景,我在计算KPI的时候,相关的函数CalcKPI还没有写好,所以我只能用monkey打桩:package monkeyimport "fmt"func CalcKPI(name...else {fmt.Println("KPI Level C")}}由于没有写完的逻辑会导致这段代码的输出永远为C,因此测试代码打桩:package monkeyimport ("reflect""testing...2 Convey单元测试工具在用Java的时候,单元测试里经常会用到断言Assert工具,JUnit工具就提供了这种支持,Spring框架也支持。

    90220

    GoStub框架使用指南

    那么,该如何对函数高效的打桩呢? 本文给大家介绍一款轻量级的GoStub框架,接口友好,可以对全局变量、函数或过程打桩,我们一起来体验一下。...使用场景 GoStub框架的使用场景很多,依次为: 1、基本场景:为一个全局变量打桩 2、基本场景:为一个函数打桩 3、基本场景:为一个过程打桩 4、复合场景:由任意相同或不同的基本场景组合而成 为一个全局变量打桩...函数是不能通过GoStub框架打桩的。...return "xxx-vethName100-yyy", nil }) defer stubs.Reset() 其实GoStub框架专门提供了StubFunc函数用于函数打桩,我们重构打桩代码: stubs...() 为一个过程打桩 当一个函数没有返回值时,该函数我们一般称为过程。

    4.4K92

    gostub源码分析

    GoMock非常优秀,但是对于普通的函数打桩来说也有一些缺点: 必须引入额外的抽象(interface) 打桩过程比较重 既有代码必须适配新增的抽象 那么有没有轻量级的打桩方法呢?...答案是gostub 全局变量可通过GoStub框架打桩 过程可通过GoStub框架打桩 函数可通过GoStub框架打桩 1,gostub 的用法 变量打桩 var counter = 100 stubs...:= gostub.Stub(&counter, 200) 函数打桩 func Exec(cmd string, args ...string) (string, error) {} 这种函数没法直接用...需要改成 var Exec = func(cmd string, args ...string) (string, error) {} 现在我们可以对Exec函数打桩了,代码如下所示: stubs :=...string, error) { return "xxx-vethName100-yyy", nil }) defer stubs.Reset() 其实GoStub框架专门提供了StubFunc函数用于函数打桩

    35310

    GoStub框架二次开发实践

    显然用户打桩时应该指定一个数组切片[]Output,那么数组切片的元素Output应该是什么呢?...,即前面几次都返回成功而最后一次却返回失败,outputs中存在多个相邻的值是一样的 2、当被打桩函数在重试调用的场景下,即被打桩函数在前面几次都返回失败而最后一次却返回成功,outputs中存在多个相邻的值是一样的...(string, error) { ... } 假设对该函数打桩之前已经生成了stubs对象,覆盖前9次尝试失败且第10次尝试成功的场景的打桩代码如下: info1 := "..." info2...将待打桩函数替换为闭包 这里直接复用既有的变量打桩方法Stub即可实现,如下所示: return s.Stub(funcVarToStub, stubVal.Interface()) 至此,StubFuncSeq...可见,当函数返回值列表都相同时仍使用StubFuncSeq接口打桩是一种反模式。

    1.3K110

    Golang 单元测试详尽指引

    GoStub GoStub 框架的使用场景很多,依次为: 基本场景:为一个全局变量打桩 基本场景:为一个函数打桩 基本场景:为一个过程打桩 复合场景:由任意相同或不同的基本场景组合而成 1.1....Monkey 至此,我们已经知道: 全局变量可通过 GoStub 框架打桩 过程可通过 GoStub 框架打桩 函数可通过 GoStub 框架打桩 interface 可通过 GoMock 框架打桩 但还有两个问题比较棘手...: 方法(成员函数)无法通过 GoStub 框架打桩,当产品代码的 OO 设计比较多时,打桩点可能离被测函数比较远,导致 UT 用例写起来比较痛 过程或函数通过 GoStub 框架打桩时,对产品代码有侵入性...Monkey 框架的使用场景很多,依次为: 基本场景:为一个函数打桩 基本场景:为一个过程打桩 基本场景:为一个方法打桩 复合场景:由任意相同或不同的基本场景组合而成 特殊场景:桩中桩的一个案例 另有...AddRow(602, "java")    rows3 := sqlmock.NewRows([]string{"id", "pwd"}).

    5K1158

    Go 单测高级篇:Golang 单测原理深入理解

    打桩就是编写或生成桩代码。打桩的目的主要有:隔离、补齐、控制。• 隔离的基本方法就是打桩,将测试任务之外的,并且与测试任务相关的代码,用桩来代替,从而实现分离测试任务。...比较复杂的是实现控制功能的桩函数,要根据测试的需要,输出合适的数据gomonkey 的打桩方式gomonkey 其实不是 mock 的方式,是通过打桩的方式,支持的打桩方式包括:• 为函数打一个桩• 为成员方法打一个桩...在 gomonkey 打桩的过程中,其核心函数其实是 ApplyCore。...不管是对函数打桩还是对方法打桩,实际上最后都会调用这个 ApplyCore 函数,如下:图片ApplyCore 函数的具体实现如下:func (this *Patches) ApplyCore(target...• gomonkey 不支持异包未导出函数的打桩、不支持同包未导出方法的打桩2-2、mocker(mock) 的模拟mocker:https://pkg.go.dev/github.com/travisjeffery

    1.9K20

    hook的几种方式及原理学习

    linux 链接器支持一个很强大的技术,称为库打桩机制,它允许你截获对共享库函数的调用,取而代之执行自己的代码。...参数,所以会进行打桩,它告诉C预处理器,在搜索通常的系统目录之前,现在当前的目录查找malloc.h 链接时 linux的静态链接器支持使用 –wrap f标志进行连接时打桩,这个标志告诉链接器,把对符号...,链接时打桩需要能够访问程序的可重定位文件。...不过,有一种机制能够在运行时打桩,只需能够访问可执行目标文件。 运行时打桩基于动态链接器的 LD_PRELOAD 环境变量。...其他 基于虚拟机提供能力、Java语言特性、消息hook(特别操作系统支持)等机制,Windows及Android上常用的hook机制。

    2.3K30
    领券