首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux 链接器 库打桩

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

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

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

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

1.4K20

GoStub框架使用指南

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

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函数用于函数打桩

23210

GoStub框架二次开发实践

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

1.1K110

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.3K20

Go:测试库(GoConvey,testify,GoStub,GoMonkey)对比及简介

什么叫打桩打桩简单地来说就是把一些代码段进行替代,而GoStub中主要可以做到的就是对一个全局变量进行打桩、对一个函数打桩和对一个过程打桩。 2....打桩的时候也是对这个函数变量进行打桩,因为函数是没有取地址一说的。那么我们要对函数变量打桩,自然打完桩之后要调用函数变量(而不是调用函数本身)!...利用GoStub对过程进行打桩 过程指的就是没有返回值,执行一些工作(比如资源清理)的函数,这些函数一样可以用StubFunc进行打桩,不同的是,StubFunc就不再需要第二个参数了。...利用GoMonkey对全局变量进行打桩 GoMonkey对全局变量进行打桩和GoStub基本一致,此处仅贴出语法: // 对全局变量Num进行打桩 patch := gomonkey.ApplyGlobalVar...利用GoMonkey对函数变量进行打桩 我们在第3章的讨论中知道,GoStub主要是对函数变量进行打桩以达到mock函数的目的的。而gomonkey本身也可以对函数变量进行打桩

6910

Go单测系列4—mock接口测试

这是Go语言单元测试从零到溜系列教程的第3篇,介绍了如何在单元测试中使用gomock和gostub工具mock接口和打桩。...本文就举例来演示如何在编写单元测试的时候对接口类型进行mock以及如何进行打桩。...= 1 { t.Fatal() } } 打桩(stub) 软件测试中的打桩是指用一些代码(桩stub)代替目标代码,通常用来屏蔽或补齐业务逻辑中的关键代码方便进行单元测试。...gomock支持针对参数、返回值、调用次数、调用顺序等进行打桩操作。...GoStub GoStub也是一个单元测试中的打桩工具,它支持为全局变量、函数等打桩。 不过我个人感觉它为函数打桩不太方便,我一般在单元测试中只会使用它来为全局变量打桩

35430

Golang Stub初体验

序言 对于领域对象的UT测试来说,基础设施层(infra)的操作函数都应该被打桩。对于Golang来说,大家通常会想到GoMock。...尽管GoMock非常优秀,但是对于普通的函数打桩来说也有一些缺点: 1、必须引入额外的抽象(interface) 2、打桩过程比较重 3、既有代码必须适配新增的抽象 我们知道,Golang支持闭包,这使得函数可以作为另一个函数的参数或返回值...,使用ExecSeqInject打桩 3、其他情况属于简单场景,直接使用ExecInject打桩 Stub验证 我们共写四个UT用例来验证Stub是否生效,前两个用例针对Stub函数,后两个用例针对Stub...不可否认,GoMock非常优秀,但对于底层的操作函数使用GoMock打桩会引入额外的复杂度,因此笔者想尝试其他方式。...本文借助闭包的特性对底层的操作函数进行打桩,根据场景的不同将打桩函数分为Stub函数和Stub序列函数,简单实用,希望对读者有一定的启发。

1.4K90

Golang 单元测试详尽指引

GoStub GoStub 框架的使用场景很多,依次为: 基本场景:为一个全局变量打桩 基本场景:为一个函数打桩 基本场景:为一个过程打桩 复合场景:由任意相同或不同的基本场景组合而成 1.1....为一个全局变量打桩 假设 num 为被测函数中使用的一个全局整型变量,当前测试用例中假定 num 的值大于 100,比如为 150,则打桩的代码如下: stubs := Stub(&num, 150)...Monkey 至此,我们已经知道: 全局变量可通过 GoStub 框架打桩 过程可通过 GoStub 框架打桩 函数可通过 GoStub 框架打桩 interface 可通过 GoMock 框架打桩 但还有两个问题比较棘手...: 方法(成员函数)无法通过 GoStub 框架打桩,当产品代码的 OO 设计比较多时,打桩点可能离被测函数比较远,导致 UT 用例写起来比较痛 过程或函数通过 GoStub 框架打桩时,对产品代码有侵入性...Monkey 框架的使用场景很多,依次为: 基本场景:为一个函数打桩 基本场景:为一个过程打桩 基本场景:为一个方法打桩 复合场景:由任意相同或不同的基本场景组合而成 特殊场景:桩中桩的一个案例 另有

4K1158

一文说尽Golang单元测试实战的那些事儿

三、解决常见的依赖等问题 解决常见的依赖等问题目前有两种思路: 通过mock方式替换实际依赖,并通过打桩操作其返回内容。...这种希望当调用函数Encode()并且参数一致,那么就执行指定逻辑的方式,就是打桩(stub)。...打桩过程还可以配置执行次数和执行顺序等,如果不知道打桩函数具体会被传入什么参数可以用gomock.Any()来代替。通过打桩可以控制依赖接口的行为,解决测试时接口依赖的问题。...看到mock字眼大家大概也知道它是怎么使用的了,也是通过对执行sql语句打桩来完成测试。...或者说被测函数有一堆sql语句,一个一个打桩起来实在是太麻烦。那么对于这种情况如果能有一个本地数据库环境就好了,省去了打桩的麻烦,但是如果是mysql这种DB的话,本地建一个最快也是用容器跑才行。

1K40
领券