Welcome 微信登录

首页 / 操作系统 / Linux

Linux平台代码覆盖率测试-GCC如何编译生成gcov/gcov-dump程序及其bug分析

Linux平台代码覆盖率测试-GCC如何编译生成gcov/gcov-dump程序及其bug分析

Content0. 序 1. 编译 gcov/gcov-dump 2. 额外的话 3. gcov-dump 程序的一个 bug 3.1 bug 描述 3.2 bug 分析与修复 3.3 正确的输出 3.4 gcov-dump 的打印开关 3.5 一个问题:上面红色的 0 是什么?谁打印出来的? 4. 总结 0. 序 某些版本的 Gcc 在默认情况下编译,可能不会产生 gcov-dump 程序,或者不会安装到 /usr/bin 。但 gcov-dump 程序...
Linux平台代码覆盖率测试-从GCC源码中抽取gcov/gcov-dump程序

Linux平台代码覆盖率测试-从GCC源码中抽取gcov/gcov-dump程序

Content0. 序 1. gcov1.1 gcov 必须的文件 (1) 实现文件 (2) 版本文件 (3) 配置文件 (4) 系统文件 1.2 如何编译生成 gcov 2. gcov-dump3. gcov-tools4. 小结 Reference附:本文代码下载地址0. 序 若想研究 gcov/gcov-dump 原理或者代码,深入函数内部跟踪调试是最好的理解方式,但 gcc 的源代码毕竟比较庞大,欲从中抽丝剥茧,往往会被 gcc 的庞大源代码吓住。...
Linux平台代码覆盖率测试-.gcda/.gcno文件及其格式分析

Linux平台代码覆盖率测试-.gcda/.gcno文件及其格式分析

Content0. 序1. .gcda文件分析1.1 gcov-dump程序输出结果1.2 文件实际内容1.3 文件格式总结2. .gcno文件分析2.1 gcov-dump程序输出结果2.2 文件实际内容2.3 文件格式总结3. 小结0. 序在"Linux平台代码覆盖率测试-gcov-dump原理分析"一文中,我们详细分析了gcov-dump程序的实现原理及每种tag的输出格式,本文,仍然以前面几篇文章的test.c为例,说明gcov-dump程序的输出...
Linux平台代码覆盖率测试-GCC插桩前后汇编代码对比分析

Linux平台代码覆盖率测试-GCC插桩前后汇编代码对比分析

Content0. 序1. 如何编译1.1 未加入覆盖率测试选项1.2 加入覆盖率测试选项1.3 分析2. 未加入覆盖率测试选项的汇编代码分析3. 加入覆盖率测试选项的汇编代码分析3.1 计数桩代码分析3.2 构造函数桩代码分析3.3 数据结构分析3.4 构造函数桩代码小结4. 说明5. 小结0. 序在"Linux平台代码覆盖率测试-GCC插桩基本概念和原理分析"一文中,我们已经知道,GCC插桩乃汇编级的插桩,那么,本文仍然以test.c为例,来分析加入覆...
结合“hello world”探讨gcc编译程序的过程

结合“hello world”探讨gcc编译程序的过程

1. gcc简介gcc/g++是GNU工程的C和C++编译器。都要用四个步骤中的一个或多个处理输入文件。· 预处理(preprocessing)· 编译(compilation)· 汇编(assembly)· 连接(linking)源文件后缀名标识源文件的语言,但是对编译器来说,后缀名控制着缺省设定。gcc命令的一般格式为:gcc [选项] 要编译的文件 [选项] [目标文件]gcc的详细内容,可参考gcc manual。2. gcc的输出选项gcc输出选...
Linux平台代码覆盖率测试-编译过程自动化及对链接的解释

Linux平台代码覆盖率测试-编译过程自动化及对链接的解释

Content0. 序1. 生成各个文件的步骤1.1 未加入覆盖率测试选项1.1.1 编译步骤1.1.2 目标文件的符号表1.2 加入覆盖率测试选项1.2.1 编译步骤1.2.2 目标文件的符号表1.3 gcc verbose选项2. 编译自动化2.1 使用collect2的makefile2.2 不使用collect2的makefile3. 关于链接的讨论3.1 链接顺序讨论3.2 错误链接顺序的例子4. 额外的话5. 小结0. 序"Linux平台代码覆...
Linux平台代码覆盖率测试工具GCOV的前端工具LCOV简介

Linux平台代码覆盖率测试工具GCOV的前端工具LCOV简介

Content1. Lcov是什么?2. 如何在Linux平台安装Lcov?3. 如何使用Lcov?(1) 使用lcov收集覆盖率数据并写入文件(2) 使用genhtml生成基于HTML的输出(3) 该例子的图形显示4. 编译lcov自带例子5. 其他相关工具(1) gcov-dump(2) ggcov1. Lcov是什么? 是GCOV图形化的前端工具是Linux Test Project维护的开放源代码工具,最初被设计用来支持Linux内核覆盖率的度量基...
Linux平台Boost的编译方法

Linux平台Boost的编译方法

Linux平台Boost的编译方法Boost的编译使用的不是已经成为公认标准的make,而是专门为Boost开发的工具bjam(boost jam)。本文以boost1.40为例,在Linux平台的编程环境为gcc4.4.1,假设Boost代码在/usr/src/boost_1_40_0目录,步骤如下。1. 获得bjam获得bjam有3种方式,如下:方法1:Boost网站上提供了各种平台上预编译好的bjam可执行程序,可直接下载使用。方法2:从Boost源...
Linux平台代码覆盖率测试-GCC插桩基本概念和原理分析

Linux平台代码覆盖率测试-GCC插桩基本概念和原理分析

Content1. 序2. GCC插桩原理2.1 GCC编译插桩的过程2.2 GCC在何处插桩2.3 GCC如何才能在编译的同时插桩3. 小结1. 序在"Linux平台代码覆盖率测试-GCC插桩前后汇编代码对比分析"一文,我们已经分析了GCC插桩前后汇编代码的变化,对GCC插入的桩代码有比较全面的了解。本文将简单叙述GCC插桩的基本概念和原理。2. GCC插桩原理2.1 GCC编译插桩的过程GCC的插桩和编译过程如下图。过程描述:(1) 编译预处理程序对源...
Linux平台代码覆盖率测试-基本块图、插桩位置及桩代码执行分析

Linux平台代码覆盖率测试-基本块图、插桩位置及桩代码执行分析

0. 序 1. 基本块概念 2. 基本块图及插桩点分析 2.1 基本块图 2.2 有效基本块图 2.3 带桩点信息的有效基本块图 2.4 插桩位置及桩代码执行情况分析 3. 小结 Appendix: 源代码中对 Basic Block 的解释 0. 序 由前面几篇文章,例如:Linux 平台代码覆盖率测试 -gcov-dump 原理分析 http://www.linuxidc.com/Linux/2011-05/36536.htmLinux 平台代码覆盖率...
Linux-AS86汇编器

Linux-AS86汇编器

在Linux0.1x系统中使用了两种汇编器。一种是能产生16位代码的汇编器,使用配套的ld86链接器;另一种是GUN汇编器gas(as),使用GUN ld链接器来链接产生目标文件。Linux系统仅用as86来创建16位的启动引导扇区程序boot/bootsec.s和实模式下初始设置程序boot/setup.s的二进制执行代码。且该编译器快速小巧,并具有一些GUN gas没有的特性,例如宏以及更多的错误检测手段。汇编器的命令行基本格式是:as86 [选项] ...
何在Android平台下编译带STL的C++程序

何在Android平台下编译带STL的C++程序

Android操作系统由linux的内核和java的UI构成。但在已往的Android系统上,一般只能用java程序进行开发。若要使用C/C++,通常是将C/C++程序做成lib再由java来调用。理论上说,android上是可以直接用C/C++开发的,因为底层的系统就是linux内核。但以前发布的android NDK,最多是可以用C和最基本的C++进行开发,不能使用STL。所以也就有了Android NDK 的Crystax版本。所幸的是,最新发布的A...
多种方法获取sys_call_table(Linux系统调用表)的地址

多种方法获取sys_call_table(Linux系统调用表)的地址

一.方法一:常用方式我们首先需要找到call table-with-offset的特征,先看下面的代码syscall_call: call *sys_call_table(,%eax,4)假设我们没有vmlinux可供gdb反汇编,那也只有采用模拟的方式了,模拟出一个call *sys_call_table(,%eax,4),然后看其机器码,然后在system_call的附近基于这个特征进行寻找 :voidfun1() { printf("fun1 ");...
Linux内核hack-运行中动态添加系统调用

Linux内核hack-运行中动态添加系统调用

Linux中每次添加一个系统调用都要完成重新编译内核,然后制作initrd等工作,不得不说这是一件繁重的工作,很多人本来已经构思好了自己的一个系统调用,要添加到内核,然后却被这些工作所中断,毫不夸张的说,制作initrd就很麻烦,虽然基于cpio的initrd可以利用几条命令完成,然而只要有一个错误,你就不得不重启系统。 我们都知道,内核模块运行在内核态,可以访问所有的内存空间,那么能不能在系统运行期间,不用重新编译内核,而运用内核模块机制实现添加系统调...
Linux内核模块的强制删除-结束rmmod这类disk sleep进程

Linux内核模块的强制删除-结束rmmod这类disk sleep进程

一.问题: 前些日子在工作中遇到一个文件,当rmmod一个模块的时候,在模块的exit函数中阻塞了,rmmod进程杀也杀不掉,永远呆在那里,发现它已经是D(disk sleep)状态了,真的无能为力了吗?我不相信这个事实,所以今天在稍微闲暇的时候换换脑子,终于有了解决办法。二.分析: 解铃还须系铃人,既然是在内核中出了问题,还是需要在内核中寻找办法,解决这类问题的前提是对内核卸载模块的精确理解,流程都理解透了,害怕找不到原因吗?原因都找到了,办法肯定是有的...
Linux的配置接口-netlink原理和设计

Linux的配置接口-netlink原理和设计

Linux内核是可配置的,配置的方式有好多种呢!对于Linux平台上上的开发者和管理员来讲,这几种配置方式可困扰了不少人儿。这里的配置不是指运行中的内核动态的配置,而是指当有新的设备或者内核特性添加进内核的时候,用户需要进行的配置。本文主要列举三种配置方式,最终落实于netlink方式的配置。1.传统方式传统方式一般认为是使用ioctl或者系统调用的方式,如果使用ioctl,当我们为设备驱动或者内核本身增加一个新的配置时,需要增加一个新的ioctl命令,这...
<< 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 >>