调试技术
文章平均质量分 65
unbutun
这个作者很懒,什么都没留下…
展开
-
ELF文件格式及程序加载执行过程总汇
这是我这段时间学习elf文件格式搜集的资料,其中的一些重量级文档,比如linkers and loaders ,the executable and linkable format等等就不贴出来了,太大----文章列表为:elf文件格式-- 1elf文件格式-- 2elf文件格式-- 3Linux动态链接技术Elf动态解析符号过程Linux 动态函式库解析Before main()转载 2010-01-14 22:05:00 · 946 阅读 · 0 评论 -
kgdb+gdb+vmware调试内核,比kdb好用,因为可以用gdb来看栈,局部变量等
准备两台虚拟机,一台编译内核,编译后将vmlinux system.map拷贝到另一台在boot下建立软连接这样在调试端用gdb vmlinux还可以找到代码看代码 配置两台虚拟机的串口为pipe形式,名字相同,一个为server,一个为client被调试的虚拟机(client): 在grub中最后加kgdboc=ttyS0,115200 kgdbwaitserver端的虚拟机转载 2011-06-05 09:01:00 · 1947 阅读 · 0 评论 -
在VMware中用Kgdb调试linux内核和Cannot insert breakpoint Error accessing memory address的解决方法
在VMware中用Kgdb调试linux内核参考:http://blog.csdn.net/jie12310/archive/2009/09/18/4564853.aspx设置断点后可能出现如下错误:Cannot insert breakpoint 4.Error accessing memory address 0xd0ce8000转载 2011-06-05 10:06:00 · 1903 阅读 · 1 评论 -
用Graphviz CodeViz可视化函数调用
http://blog.chinaunix.net/u3/119403/showart_2347423.html安装1.安装GraphViz调用图的天生依靠于GraphViz,所以首先要安装GraphViz。可以下载源码包编译、安装。我在这偷点懒:tbag@:~$sudoapt-getinstallgraphviz2.简单安装CodeViz下载CodeVize源码包:http://www.csn.转载 2011-06-24 00:03:00 · 1029 阅读 · 0 评论 -
GDB 调试演示 (very good)
作为内置和最常用的调试器,GDB 显然有着无可辩驳的地位。熟练使用 GDB,就好像所有 Linux 下的开发人员建议你用 VIM 一样,是个很 "奇怪" 的情节。测试用源代码。#include int test(int a, int b){ int c = a + b; return c;}int main(int argc, char* argv[转载 2011-06-28 21:46:00 · 587 阅读 · 0 评论 -
gcc-vcg-plugin : 視覺化 GCC 內部結構
對岸的 Eric Fisher 做了一個很棒的工具 [gcc-vcg-plugin ],本質上是個 GCC Plugin,可輸出 VCG 格式的圖例,作為分析 GCC 內部架構使用。筆者在 Ubuntu Maverick (10.10 開發中版本) 測試過,配合 gcc-4.5转载 2011-07-12 20:24:45 · 559 阅读 · 0 评论 -
各类分析函数调用关系图的工具
calltree 2.3 http://mirror.lzu.edu.cn/software/calltree/calltree-2.3.tar.bz2 gprof 2.18.0.20080103 在ubuntu/debian下直接安装即可 http://citeseer.ist.psu.edu/graham82gprof.html kprof 1.4.3 (在ub转载 2011-06-23 23:54:00 · 858 阅读 · 0 评论 -
ftrace和perf
今天没去参加吃喝玩乐,跑去加班,不过心情还是愉悦的,因为有收获。真是利器啊。调试例子ftrace_demo.c/** ftrace_demo.c*/#include #include #include MODULE_LICENSE("GPL转载 2011-07-11 20:44:21 · 702 阅读 · 0 评论 -
shell中set命令详解
使用set命令可以设置各种shell选项或者列出shell变量.单个选项设置常用的特性.在某些选项之后-o参数将特殊特性打开.在某些选项之后使用+o参数将关闭某些特性,不带任何参数的set命令将显示shell的全部变量.除非遇到非法的选项,否则set总是返回ture.当BASH转载 2011-07-13 20:54:59 · 1320 阅读 · 0 评论 -
set -- $line 怎么理解
man bash: you will find below-- If no arguments follow this option, then the positional parameters are unset. Otherwise, the positi转载 2011-07-13 21:03:16 · 536 阅读 · 0 评论 -
gprof使用介绍 (gcc -pg)
gprof介绍gprof是GNU profiler工具。可以显示程序运行的“flat profile”,包括每个函数的调用次数,每个函数消耗的处理器时间。也可以显示“调用图”,包括函数的调用关系,每个函数调用花费了多少时间。还可以显示“注释的源代码”,是程序源代码的一个复本,标记转载 2011-07-15 19:50:24 · 2948 阅读 · 1 评论 -
gcc-vcg-plugin (gcc 4.4以后支持plugin模式,不需要重新编译即可使用,可惜编译这个东西需要完善工具链,比较麻烦,如果作者能直接提供编译好的,大家用就行了,没必要再编)
http://code.google.com/p/gcc-vcg-plugin/ 简介GCC VCG Plugin是一个GCC插件,可以将GCC在编译程序的过程中,产生的内部数据结构图形化;从而,方便分析应用程序和GCC本身。目前,可以初步图形化➔ 控制流图➔ 函数调用图➔ 支配转载 2011-07-12 20:23:20 · 933 阅读 · 0 评论 -
Debugging with GDB
代码编译 # 在调试代码时不要打开编译器优化选项$ gcc -g3 -Wall -Wextra -o test1 test1.c # 完成调试后才使用优化选项$ gcc -O9 -g3 -Wall -Wextra -o test1 test1.cSta转载 2011-08-07 08:49:48 · 429 阅读 · 0 评论 -
程序断点与数据断点
<br />现在让我们看一看,处理器处理硬件程序断点与数据断点的区别是什么。对于硬件程序断点,我们知道,处理理器需要从内存中取指,而处理器也有一个程序指针PC(program counter),通过将PC值与我们所设置的程序断点位置值相比较,处理器就可以实现硬件程序断点了。但数据指令就不一样了,处理器必须监听地址总线,当发现有向关心的地址写数据时,就中断程序的运行。<br /><br />转载 2011-03-30 19:40:00 · 408 阅读 · 0 评论 -
关于Valgrind
<br />Valgrind是一个目前逐渐被重视起来的调试工具,一直打算研究研究,今天上午看了看关于Valgrind的一些文档,对它有了初步的了解,顺便翻译了一下关于Valgrind的介绍。这些资料都是从Valgrind官方网站上获得的。<br /><br />原文链接<br /><br />译文<br />Valgrind是一个GPL的软件,用于Linux程序的调试和压型(profiling)。使用Valgrind的工具包,你可以自动的检测许多内存管理和线程的bug,避免花费太多的时间在bug寻找上,使得转载 2011-02-21 21:29:00 · 1035 阅读 · 0 评论 -
转:Before main() 分析 实例2
main程序的堆栈内容演示:===========================================================预备知识:1. 常用命令(gdb) b * 0x80483d8 # 在地址处设置断点(gdb) b main # 在标号处设置断点(gdb) disass 0x80483d8转载 2010-01-15 14:30:00 · 474 阅读 · 0 评论 -
使用objdump看内核源码
1. 修改源代码的顶层 Makefile CC =$(CROSSCOM_PILE)gcc 为 CC =$(CROSSCOM_PILE)gcc -g 使成生的vmlinux中含有debug信息2. 所有生成 .o 的 rule 中再加一条 /*其他参数除了-c外抄生成.o文件用的参数*/ CC -E -dD -转载 2009-12-14 16:11:00 · 1396 阅读 · 1 评论 -
从core映像文件中重新构造ELF可执行文件
/////////////////////////////////////////////////////////////////////////////////////最近会贴一些当初学习unix病毒和elf结构时的文章,帮助大家理解elf格式,以及利用这些知识做一些比较有趣的事情//////////////////////////////////////////////////////////转载 2010-04-07 19:46:00 · 385 阅读 · 0 评论 -
玩转Google开源C++单元测试框架Google Test系列(gtest)(google test的使用,很详细,用着了再试)
<br />http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html转载 2010-06-26 22:03:00 · 264 阅读 · 0 评论 -
__builtin_extract_return_addr 更多gcc的东西见 http://gcc.gnu.org/onlinedocs/gcc/
6.47 Getting the Return or Frame Address of a Function<br />These functions may be used to get information about the callers of a function. — Built-in Function: void * __builtin_return_address (unsigned int level)<br /><br />This function returns the retur转载 2010-07-06 21:57:00 · 1182 阅读 · 0 评论 -
Linux 自检和 SystemTap
SystemTap 是监控和跟踪运行中的 Linux 内核的操作的动态方法。这句话的关键词是动态,因为 SystemTap 没有使用工具构建一个特殊的内核,而是允许您在运行时动态地安装该工具。它通过一个名为Kprobes 的应用编程接口(API)来实现该目的,本文将探索这个 API。我们首先了解以前的一些内核跟踪方法,然后在深入探讨 SystemTap 的架构及其使用。转载 2010-05-17 21:40:00 · 687 阅读 · 0 评论 -
GCC 函式追蹤功能
<br />昨天有一位同事問及 ARM call frame 相關的問題,我給的建議是透過 GCC Function instrumentation 的機制。該機制出現於 GCC 2.x,由 Cygnus (現為 RedHat) 所提出,在 GCC 中對應的選項為:"finstrument-functions",查看 man page 可得以下資訊: -finstrument-functions<br /><br />Generate instrumentation calls for entry and转载 2010-09-13 21:40:00 · 488 阅读 · 0 评论 -
堆栈中的EIP EBP ESP
<br />EIP,EBP,ESP都是系统的寄存器,里面存的都是些地址。<br /> 为什么要说这三个指针,是因为我们系统中栈的实现上离不开他们三个。<br /> 我们DC上讲过栈的数据结构,主要有以下特点:<br /> 后进先处。(这个强调过多)<br /><br />其实它还有以下两个作用:<br /> 1.栈是用来存储临时变量,函数传递的中间结果。<br /> 2.操作系统维护的,对于程序员是透明的。<br />我们可能只强调了它的后进先出的特点,至于栈实现的原理,没怎么讲?下面我们就通过一个小例子说转载 2010-09-13 21:46:00 · 390 阅读 · 0 评论 -
反推函数调用栈
理解调用栈最重要的两点是:栈的结构,EBP寄存器的作用。首先要认识到这样两个事实:1、一个函数调用动作可分解为:零到多个PUSH指令(用于参数入栈),一个CALL指令。CALL指令内部其实还暗含了一个将返回地址(即CALL指令下一条指令的地址)压栈的动作。2、几乎所有本地编译器都会在每个函数体之前插入类似如下指令:PUSH EBP; MOV EBP ESP;即,在程序执行到一个函数的真正函数体时,已经有以下数据顺序入栈:参数,返回地址,EBP。由此得到类似如下的栈结构(参数入栈顺序跟调用方式有关,这里以C语转载 2010-12-02 19:47:00 · 891 阅读 · 0 评论 -
函数调用栈详解(good)
<br /><br /> <br /> <br />全国嵌入式人才培训基地<br /><br />1. 函数调用<br />上一页 <br />第 19 章 汇编与C之间的关系<br /> 下一页<br />1. 函数调用请点评<br />我们用下面的代码来研究函数调用的过程。<br />例 19.1. 研究函数的调用过程<br />int bar(int c, int d)<br />{<br /> int e = c + d;<br /> retu转载 2010-12-02 20:32:00 · 1668 阅读 · 0 评论 -
Linux PID namespace (转,namespace主要用于对用户态虚拟化的支持,更多的解释见man clone,中的CLONE_XXXX)
<br />一直对linux内核的namespace感到困惑,今天看了一下代码才知道,原来所谓的namespace其实就是给虚拟化用的,PID namespace其实就是建立一个新的PID空间,这样内部可以使用一套新的PID,而且不会和外部冲突。这也就是说某个进程其实会有两个PID,一个空间一个。<br />我写了段C代码来展示这个问题。<br /> <br />C: #include <errno.h>#include <stdio.h>#include <stdlib.h>#includ转载 2010-12-12 09:24:00 · 2905 阅读 · 0 评论 -
Valgrind工具包
Valgrind发布版包括四个有用的调试和压型(profiling)工具:<br />Memcheck<br />Memcheck检查内存管理问题,主要用于C和C++程序。当一个程序在Memcheck监督下运行时,所有的内存读写都被检查,对malloc/new/free/delete的调用都被截取。所以,Memcheck可以检查程序的下列问题:<br />访问它不应该访问的内存(没有被分配的区域,已经被释放的区域,超过堆尾部的区域,栈中不可访问的区域)。<br />以危险的方式使用未初始化的值。<br />转载 2011-02-21 21:32:00 · 434 阅读 · 0 评论 -
开源静态代码检测工具Splint
如果想用一个有效的工具察看C/C++源代码中的错误,遗漏,不确定的构建过程,以及移植问题等等,你应该来看看Lint。可以把Lint当成一个编译器,除了不产生代码之外,对于错误和警告的报告来说已经非常足够了。通常,一个C/C++的编译器假设程序是正确的,而Lint恰恰相反,因此它优于编译器执行的一般性检查。Lint还可以贯穿多个文件来执行它的错误检查和代码分析,这是编译器做不到的。转载 2011-10-27 22:32:53 · 636 阅读 · 0 评论