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

linux 链接器 库打桩

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

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

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

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

    1.5K20

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

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

    7K10

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

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

    77311

    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框架也支持。

    68120

    GoStub框架使用指南

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

    4.1K92

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

    27010

    GoStub框架二次开发实践

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

    1.1K110

    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"}).

    4.4K1158

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

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

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

    31210

    hook的几种方式及原理学习

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

    2K30

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

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

    56730

    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.5K90
    领券