• 探索GDB的移植

    日期:2011-06-09 | 分类: | Tags:gdb

    GDB已经被移植到到十几个处理器和平台上,足以证明GDB的结构是便于移植的。本文简单介绍了,作者在移植GDB的过程中,使用和修改的一些GDB hook函数,从而进一步理解这些hook函数的作用。

    http://filer.blogbus.com/11149686/resource_11149686_1307586989v.pdf

    幻灯片就是上周活动时候用的,加了一点点小的修改。

  •  

    GNU Toolchain的起步工作往往是最艰难的,因为往往有无从下手的感觉。开源社区往往有很多“潜规则”,使得一开始就进行一些大的修改,变得更加困难。所以,在刚刚开始GNU
    Toolchain工作的时候,最好能够从一些小的地方入手,慢慢的融入这个社区(如果足够幸运,有global
    maintainer领导你干一些事情,那些这个文章就没有用了,可以忽略)。本文以gdb为例,看看如何用一个静态检查工具,找到一些比较明显的程序错误。修改这些错误,就是一个很好的起点。
    
    1 clang-analyzer
    clang-analyzer是一个建立在llvm/clang基础上的一个静态检查工具。只要在需要检查的代码,例如gdb,用clang-analyzer来运行configure和make,就可以生成检查结果。我个人对clang-analyzer没有什么理解,如何编译参见http://clang-analyzer.llvm.org/。
    
    2 检查gdb
    clang-analyzer的优秀设计,使得不需要对gdb做任何调整,就可以对它进行静态分析。假如,我原有的gdb configure/make 如下,
    
    $ ../git/gdb/configure --with-python=/usr/bin/python --disable-gdbtk
    $ make -j4;
    
    那么使用clang-analyzer检查gdb,就可以这样;
    
    $ PATH=~/SourceCode/svn/build/Debug+Asser/bin:$PATH
    ~/SourceCode/svn/llvm/tools/clang/tools/scan-build/scan-build
    ../git/gdb/configure --with-python=/usr/bin/python --disable-gdbtk
    $ PATH=~/SourceCode/svn/build/Debug+Asser/bin:$PATH
    ~/SourceCode/svn/llvm/tools/clang/tools/scan-build/scan-build make -j4
    
    其实很简单,就是在原有的命令前边加入 scan-build.
    
    原有的gdb build很变得比较慢,在gdb build结束后,你可以看到这样的输出
    
    scan-build: 401 bugs found.
    scan-build: Run 'scan-view /tmp/scan-build-2011-03-09-1' to examine bug reports.
    
    你就运行scan-view就好了,
    $ PATH=~/SourceCode/svn/build/Debug+Asserts/bin:$PATH
    ~/SourceCode/svn/llvm/tools/clang/tools/scan-view/scan-view
    /tmp/scan-build-2011-03-09-1
    
    3 分析gdb中的错误
    在运行完scan-view后,浏览器会自动打开网页,里边包含clang-analyzer的分析结果,并且对找到的bug进行分类。首先声明一点,clang-analzyer和所有的静态分析一样,会有false
    positive,所以,不是所有的错误都一定是真正的bug,需要我们自己结合程序逻辑自己分析。经过我自己的浏览,发现"Dead
    Assignment"这样的错误基本上都是对的,因为这样的错误相对比较简单。
    
    例如,
    Dead store	Dead assignment	git /gdb /gdb /linux-nat.c	5603	1	View
    Report 	Report Bug	Open File
    
    单击 “View Report”,可以看到,pid在5603行写入以后,再没有在别的地方被读了。所以,这里*有可能*把5603行删去。
    
    5596	struct address_space *
    5597	linux_nat_thread_address_space (struct target_ops *t, ptid_t ptid)
    5598	{
    5599	struct lwp_info *lwp;
    5600	struct inferior *inf;
    5601	int pid;
    5602	
    5603	pid = GET_LWP (ptid)ptid_get_lwp (ptid);
    	
    Value stored to 'pid' is never read
    
    5604	if (GET_LWP (ptid)ptid_get_lwp (ptid) == 0)
    5605	{
    5606	/* An (lwpid,0,0) ptid. Look up the lwp object to get at the
    5607	tgid. */
    5608	lwp = find_lwp_pid (ptid);
    5609	pid = GET_PID (lwp->ptid)ptid_get_pid (lwp->ptid);
    5610	}
    5611	else
    5612	{
    5613	/* A (pid,lwpid,0) ptid. */
    5614	pid = GET_PID (ptid)ptid_get_pid (ptid);
    5615	}
    5616	
    5617	inf = find_inferior_pid (pid);
    5618	gdb_assert (inf != NULL)((void) ((inf != ((void*)0)) ? 0 :
    (internal_error ("../../git/gdb/gdb/linux-nat.c"
    , 5618, gettext ("%s: Assertion `%s' failed."), __PRETTY_FUNCTION__
    , "inf != NULL"), 0)));
    5619	return inf->aspace;
    5620	}
    
    这样,就可以自己写一个两三行的小patch,发送到gdb-patches了。如果运气好,你的第一个commit,就快有了 :)
    
    4.  结束语
    llvm有着十分优秀的infrastructure,使得在上边做一些静态分析工具,成为可能。clang-analyzer就是这样的一个小工具,而且在上边扩充十分容易。另外,我们可以用它来分析一些GNU
    Toolchain,从中找到问题,提交我们自己的前几个patch。
    

     

  • mingjie.xing@hellogcc

    向GNU提交代码,必须要签署FSF版权转让协议(copyright assignment),这意味着你是作为贡献者将这些代码的版权归为FSF所有。这里只介绍了以个人的名义来申请签署协议和进行开发的流程,至于以公司的名义的流程,我不清楚,故没有介绍。申请签署该协议的方法为,填写如下表格,并发送给assign@gnu.org 。下边给出样例答案。


    Please email the following information to assign@gnu.org , and we
    will send you the assignment form for your past and future changes.

    Please use your full legal name (in ASCII characters) as the subject
    line of the message.
    ----------------------------------------------------------------------
    REQUEST: SEND FORM FOR PAST AND FUTURE CHANGES

    [What is the name of the program or package you're contributing to?]
    binutils, gcc, gdb

    [Did you copy any files or text written by someone else in these changes?
    Even if that material is free software, we need to know about it.]

    这里是询问你是否拷贝了别人的文件或者代码。如果你的修改里边包含了哪个的公司的代码,就一定要在这里声明。
    如果你没有copy别人的代码,写no。
    个人理解,你copy其他gnu的部分代码,是没有关系的。反正都是gpl,也是fsf的copyright。

    [Do you have an employer who might have a basis to claim to own
    your changes?  Do you attend a school which might make such a claim?]

    这里是询问你的雇主是否要求拥有你的修改的版权。如果是个人性质参与gnu开发,写no就好了。是公司行为,而且公司不愿意放弃这个修改的版权,那么需要在这里声明。

    [For the copyright registration, what country are you a citizen of?]


    [What year were you born?]


    [Please write your email address here.]


    [Please write your postal address here.]


    [Which files have you changed so far, and which new files have you written
    so far?]


    FSF会通过邮递的方式将协议邮寄给你,你签名之后再邮寄回去,整个过程大约要2,3个月的时间。所以,个人觉得,如果你确定有一些patch将要提交,则可以提前进行申请,这样可以节省时间,没有必要等patch发出去,被审核(review)通过之后再申请。需要注意的是,每个GNU项目都必须是单独签订协议的,所以,如果你想同时向gcc,binutils和gdb提交代码,则需要在申请表中填写gcc,binutils,gdb三项,并会收到三份协议。

    如果你在“Do you have an employer who might...”栏下填写了“yes”。则还会寄给你一份需要你的上司来签署的协议(employer disclaimer of rights)。

    推荐使用真实的姓名。一方面,这是有法律效应的;另一方面,毕竟作贡献也是好事,没必要使用绰号。

    代码以patch的方式发送到向邮件列表,经过审核通过之后,便可以被接受,并提交到版本库中。如果你打算长期参与开发,则可以申请获得版本库的写权限,这需要一些条件,比如你对项目已经很熟悉,最主要的,是需要有一位Maintainer来保荐(sponsor)你。
  • 开始加入gnu toolchain的开发

    日期:2011-01-26 | 分类:文档 | Tags:GNU 社区

    作者: qiyao@hellogcc

    很多刚刚加入gnu toolchain开发的工程师,都会被各种各样的规定,缩写还有交流方式搞得晕头转向。本文就是为了让刚刚进入gnu toolchain的开发的工程师简单介绍一下在这个圈子里边工作的一些特别之处。


    1 开发流程
    checkout change diff submit approve commit

    checkout就不用说了,绝大多数人都知道怎样check out代码。

    change:
    这里以emacs为例,编写代码要注意gnu的编码规范。写代码前,自己好好读两遍。

    对于其他编辑器,比如vim和eclipse,用户可以自行设置。只要符合下边的一些要求就可以了
    1 敲击一下tab是两个空格,
    2 如果前边有了八个空格,用一个tab替代,
    3  一般源程序的宽度不要超过76或者78,
    4  changelog的宽度不要超过72,

    这里有一个比较详细的,http://sourceware.org/gdb/wiki/JoelsCodingStyleCheatSheet
    虽然是给gdb开发者看的,但是基本适合其他gnu toolchain项目。

    建议安装whitespace.el,来显示空格和tab,还可以去掉一些trail space。还有在使用git生成patch的时候,使用git diff --check,可以帮助你检查patch。

    生成patch以后,一般是在patch的头部加入changelog,用mklog.pl 。这个时候不用修改源代码的changlog。

    发送patch,一般gnu toolchain都用单独的邮件列表来讨论patch的。所以,把你的patch按照附件的形式,用纯文本的方式,放送到列表。邮件的题目要简单明了,因为邮件列表的流量很大,而且每个maintainer可能只注意自己需要review的patch,所以标题要让他/她知道,这个是他/她需要review的。比如,有一个patch是对arm的修改,可以这样[patch/arm] XXXXX。多看看别人怎样写的。

    还有的时候,邮件标题可以用 [rfc], [rfa]之类的。rfc的意思是request for commit,而rfa的意思是request for
    approval/accept。我自己并不经常用这两个,我个人感觉他们的差别在于rfc是提交自己的一个代码或者patch,希望被接受;而rfa是提交的自己的想法或者建议。比如我想建议在gdb中做一个新的feature,program slicing,我可以把我的建议和设计这样发出去  [rfa] New feature in GDB : program slicing

    [note: 我个人对rfc和rfa用的不多,所以解释不是很准确]

    在邮件中简单介绍你的修改的目的和概要,如果需要,保证这个修改没有引入regression。

    有的时候,可能为了实现一个功能,修改是分很多部分的,比如第一部分是为了增加这样的功能,对现有代码的重构,第二部分是实现新功能的代码,第三部分是测试用例,第四部分是文档。如果作为一个patch发出去,别人review起来比较难受,也很难理解你的意图,这个时候,就要在一个邮件thread里边,把patch分多个发出去。具体操作如下,在发patch之前,自己先想好,如何把自己的修改合理的拆分到若干个patch里边去,然后第一封信写清楚你这一系列patch的目的,和大体实现,不要attach任何patch,比如
    [patch 0] GDB new feature: program slicing,发送。然后依次恢复这封邮件,分别按照不同的题目,把自己的patch按照顺序发出去,比如
    [patch 1] refactor existing GDB infrun to prepare for program slicing
    [patch 2] support program slicing in target-independent part
    [patch 3/x86] support program slicing on x86
    [patch 4] test case and doc

    这样的好处就是,负责doc和testcase的maintainer就需要看你的第三个patch就好了。负责x86 maintainer就看你的patch 2。而且以后给comments也比较容易。

    如果还不明白,看看别人是怎样写patch的。不过还不明白,可以在hellogcc讨论。

    commit的时候,加入changelog entry。在emacs里边,比较方便,M-x add-changelog-entry后,选择changlog文件,就会自动加入你的邮件地址和时期,完全符合gnu的规定。如果源代码不是很多,比如gdb,可以用emacs提供的前端pcl-cvs, pcl-git来替代命令行的操作。 M-x cvs-examine: 选择本地的cvs checkout出来的代码,等待一会后,emacs中会有一个cvs summary的buffer,显示本地目录那些改动过的文件。在提交的时候,用m选中那些需要提交的文件,然后按c,就会出现一个新buffer,里边是填写commit log。写完commit log后 C-c C-c,就完成commit了。pcl-cvs和pcl-git还有很多别的用法,可以参考网上的文章。

    测试:
    不要忽略自动测试的部分。个人感觉,gdb里边写的做好的部分就是testsuite了 :)
    gcc和gdb的wiki上都有一页关于编写测试用例的。建议好好读一读。如果之前对dejagnu和tcl/expect不是很清楚的人,建议去了解一下dejagnu。

    regression test:如果你持续在某个toolchain上开发,最好有一个nightly build/test的环境,这里就不介绍持续测试和持续集成了。因为gnu toolchain每天都有来自不同组织处于不同目的对软件进行修改,所以,难免影响到你所希望的功能。如果发现了有regression,可以自己试试修改,这也是做贡献的一种方式。

    2 参与开发
    gnu toolchain都比较庞大,支持的平台很多,所以刚开始理解代码并且加入到开发是一个十分困难的事情,但是这个也是没有其它什么捷径。造成这些困难的有如下一些因素

    历史悠久: 历史悠久对于一个国家或者城市来说,是一个好事情,但是,对于软件来说,这绝对不是什么好事情。

    支持很多平台:

    缺少文档:

    开放的是代码而不是设计: 我们可以看到代码,但是很难看到设计。设计往往存在于代码的注释或者当时邮件列表里边的讨论。

    寻找帮助:
    由于开源软件都缺乏文档,所以碰到不会的问题,就要在社区中寻求帮助。目前,社区的交流方式有这样几种,邮件和irc。当然还有第三种,就是参加一年一次的gcc summit,但是这个对大多数人是不适用的。

    邮件列表:是开发人员的主要交流手段。如何写邮件可能是另外一个话题了,我这里简单介绍一下。其实和考研写英语作文很像,就是开始就要明确地告诉别人,我需要什么样的帮助,要非常具体。这样被人才能帮助你。我们这样想,我们都希望得到大牛的指点,但是,大牛一天要收多少邮件呢?凡是他/她第一感觉能回的邮件,他就马上回了,如果有点模糊,他/她可能就跳过去了,回复的可能性很小。所以开门见山,告诉别人你的问题是什么,你都做了那些尝试,还有那些不明白,需要别人的指点。

    irc:irc是一种即时聊天软件。我个人觉得,不要期望你能在irc上得到十分好的帮助,除非你和irc的人都很熟了。因为,gnu toolchain的问题,都不是一句两句能说清楚的事情(除非你问gcc 4.6.0什么发布,irc也是一个不错的地方),所以我个人认为irc在获得帮助上没有太大的用处。有一种情况是irc有用的,就是你和某一位或者几位开发人员在邮件列表上已经有过一些交流,剩下一些细节或者yes/no的问题,在irc上问一下,也还不错。

    贡献:
     其实在open source 社区中,贡献这个词语出现很多次,但是我们还是没有很多的贡献,至少我是这样。下边这些是为那些想为open source 做些事情的人写的,如果你只是为了用开源软件完成自己的工作或者研究项目,可以跳过这一段。首先澄清一个概念,不是只有global maintainer才可以做贡献,我们这些刚刚开始做的人,也可以。勿以贡献小而不为。我能够想到的,在社区的贡献对你有以下的帮助
     1 慢慢被社区所认可和接受,这样对于以后的工作会更有帮助,也有助于下一步的发展
     2 短期来讲,有助于别人帮助review你的patch
     3 提高在社区的reputation

    对于我们刚刚起步的人,可以做那些贡献呢?我们可以到gdb的wiki上看看,上边说了一些需要帮忙的领域,在gdb邮件列表archive里边找找相关的讨论,就能找到一些事情。这样的话,你将来碰到问题,也有人愿意帮助你。所以,尽力去发现开源软件的不足,尽力去改进它,虽然我们很多人在gnu toolchain上开发是我们的工作,但是不要把自己的贡献局限于我们的工作。

    总结起来就是,眼光要放远,但是从细节着手。不要把自己的眼光之放在自己的工作的领域,要看得更宽一些,如果有机会在别的部分做一些东西,这样也有助于你有一个大局观。从细节着手,就是说,gnu toolchain的代码都很多,刚开始根本找不到要该的地方。这个时候,就要从一些小的地方开始,比如修一些bug,慢慢的,就会知道更多要改进的地方了。

    总结:
     罗马不是一天建成的。我们也不可能在很短的时间内熟悉这个community,更不要奢望读了这篇blog就可以熟悉这个community的工作方式。我想,只要我们保持热情去贡献,增加交流,在我们中国诞生global maintainer也不是不可能的事情。
  • 原文地址 http://code.google.com/p/qp-gcc/wiki/build_gdb_msys_cn 转贴请和原作者联系 asmwarrior AT gmail

    准备条件

    解压缩工具

    不要说你没有这个,我推荐用 7-zip,呵呵,可以从以下链接处下载: 7-Zip,建议下载最新版本(或者最新的beta版本),因为下文中介绍的7z包有可能是用最新的7z压缩的,所以你下了老版本可能解压不了。

    GCC编译器

    我使用的Loaden的MinGW GCC编译器 Loaden的GCC,因为里面已经包含了iconv包,如果没有这个库的话,可能导致编译出来的gdb在显示unicode字符的时候会变成乱码。 另外,Pcx的MinGW GCC编译器也是一个不错的选择MinGW_win32_gcc4.5.2static_snapshots.7z,只不过这个编译器的包里面还没有iconv库,有需要的可以和Pcx本人联系索取。(或者向我索取也可以,Pcx也给了我一份)

    使用MSYSgit下载最新gdb代码

    gdb的源代码是基于cvs的,当然也有一个可读的git。 我使用的是一个绿色版本的Windows下的git客户端,该客户端的下载链接是 PortableGit-1.7.3.1-preview20101002.7z 解压后。重要的一个步骤,先修改里面的一个配置文件,位于:“\etc\gitconfig” 这个文件里面,把 autocrlf的默认值true,改成false,即“autocrlf = false”。否则下载下来的gdb源代码无法编译通过,会出现莫名其妙的编译错误,这也是我和Pcx折腾了好几天才发现的重要经验。接下来,运行 git-bash.bat 文件启动该程序,然后就可以去下载 git 版本管理的 gdb了,具体的地址可以看gdb的页面:Current GDB ,里面使用的是这个命令:

    git clone git://sourceware.org/git/gdb.git

    python2.7的安装

    这个步骤比较简单,直接去python网站下载安装了就可以了,目前我使用的是python2.7.1,你去下载安装就OK了。

    MSYS shell

    前面的MSYSgit其实也带有一个MSYS环境,但是我感觉这个里面的工具不够全,只是用来git使用没有问题,如果需要编译gdb,我就去下载了一个最新的MSYS 32位的包,下载的地址是: MSYS-20101010.zip,同样是解压后,需要修改一下配置文件 “\msys\etc\fstab”,如果没有这个文件,大家可以自己建一个空的此文件(这是一个没有扩展名的文本文件),里面主要是进行路径的映射,我的是这样的:

    D:/code/MinGWLoaden /mingw
    F
    :/cb/python271 /python

    我的MinGW编译器,是装在 D:/code/MinGWLoaden ,所以在MSYS里面,我把它映射为 /mingw python的路径也是类似的映射。 注意,在Windows系统的PATH环境变量里面,你最好把所有的别的mingw的路径全部删除掉,否则容易引起不同版本的MinGW的混淆。还有一个特别要注意,D:/code/MinGWLoaden/bin 目录下面,有一个make.exe 文件,你一定要删除掉,因为我们不需要这个MinGW版本的make.exe, 我们需要的是MSYS自己带的make.exe(位于你的msys的bin目录下)。如果不删除MinGW下的make.exe文件,你将无法编译gdb。

    expat库的源代码

    如果没有expat的库,你编译出来的gdb也可以正常工作,但是却无法调试dll文件,所以还是有必要去下载expat的,下载的地方有好几个,例如:expat-2.0.1-1-mingw32-src.tar.gz 就可以了,下载之后解压缩。

    编译

    编译expat库

    首先编译expat库,这个比较简单,先打开MSYS界面(注意,不要用msysgit的那个,要用WikiSyntax#MSYS_shell),cb命令转移当前的目录到expat所在的目录,输入命令:

    ./configure -prefix=/E/test/expat/install --enable-static

    上面的这句命令的意思,就是生成静态版本的expat库。然后在命令行里面依次输入:

    make
    make install

    一切正常的话,编译好的expat库,就被安装到 “/E/test/expat/install”了,大家也可以根据自己的需要放置expat库的路径。

    设置python的头文件和路径

    由于gdb源代码里面检测python的机制默认是针对linux下用的,所以在windows会检测失败,以至于在编译的时候gdb会提示死活都找不到python。解决方法如下: 下面是我自己琢磨出来的修改步骤,能保证gdb在编译过程的时候正确的找到python,并且编译成功!

    1. 假设我的python的安装目录是F:\cb\python271,头文件所在的目录是:F:\cb\python271\include,于是,你在这个目录里面,新建一个名字叫做 python2.7 的目录,也就是说,创建一个 “F:\cb\python271\include\python2.7”,然后你把原来“F:\cb\python271\include”里面的内容,都复制一份,放到这个python2.7的目录里面。 (因为gdb默认会去检索这个目录的头文件,也许linux下的目录结构是这样的吧。。)
    2. 修改库文件,在路径F:\cb\python271\libs\下面 ,复制一份libpython27.a ,并且改名字为:libpython2.7.a (gdb会查找libpython2.7.a这样的库名字,而不是前者)

     

    编译gdb

    在MSYS命令行下面,进入你下载的git版本管理的gdb源代码目录。例如,在我的电脑上面,我的git的gdb源代码位于 "E:\test\unix_gdb\gdb" ,那么我就创建一个名字叫做 build 的文件夹,位于: E:\test\unix_gdb\build

    这样,你就可以在MSYS里面,进入这个build目录。然后运行configure命令:

    ../gdb/configure --prefix=/E/test/install --build=mingw32 --host=mingw32 --target=mingw32 \
       CFLAGS
    ="-s -L/python/libs -I/python/include -I/E/test/expat/install/include -static -L/E/test/expat/install/lib" \
       
    --with-python \
       
    --with-expat

    完了之后,就可以依次运行命令:

    make

    make install

    最后,编译的过程大概需要20多分钟(根据你的电脑速度好坏)。

    完成之后的gdb应该就会出现在:上面定义的 "--prefix=/E/test/install" 目录里面。

    这样,你就成功了!!!

    其他

    如果要更新git管理的gdb源代码,你需要在你的MSYSGIT 的界面里面,转移到gdb的目录,然后运行的命令是 git pull

    关于如何使用wxwidget提供的python pretty printer的gdb调试脚本,或者gcc stl c++标准库的调试脚本,请查看这个wiki网页http://code.google.com/p/qp-gcc/wiki/GDB

    感谢

    非常感谢Loaden等人提供的gdb的交叉编译方法,以及Loaden的编译器。 非常感谢Pcx,我们一起讨论和研究了gdb的编译问题。

    参考链接

    1. http://dev.zhourenjian.com/blog/2009/03/11/compiling-gdb-debugger-in-windows.html
    2. http://sourceforge.net/projects/mingw/files/MinGW/BaseSystem/GDB/GDB-7.2/gdb-7.2-1-mingw32.RELEASE_NOTES.txt/download

    本文作者自我介绍

    Asmwarrior

    另外,“ollydbg”是我在Codeblocks英文论坛的ID,我对开源的Codeblocks的IDE很感兴趣。

  • 编译GDB(主要针对LINUX平台)

    日期:2010-12-14 | 分类:文档 | Tags:gdb 编译

     

    teawater@hellogcc
    

    1. 取得源码
    通常人们选择release的版本,可以直接到http://www.gnu.org/software/gdb/download/,这里介绍了各种下载地址,建议下载最新版本。
    
    当然我个人更推荐使用trunk,BUG这里最早修复,新功能这里最早会有,只是很偶尔会有编译出错的情况(今年我好像还没碰见过),大约过个1天也会有人修复。唯一的缺点是你需要经常更新你的GDB代码并编译安装他们,当然这其实也花不了多少时间。
    取得trunk也可以通过下载的方式,ftp://sourceware.org/pub/gdb/snapshots/current/gdb.tar.bz2就是当前GDB的源码。
    当然如果经常更新的话,每次都下载十几M的源码包肯定比较麻烦,这时候最好就能用到版本控制工具来取得代码。GDB官方的版本控制使用的CVS,你可以用:
    cvs -z9 -d :pserver:anoncvs@sourceware.org:/cvs/src co gdb
    取得最新的GDB代码,而在取得源码用目录中用:
    cvs update
    就可以更新源码。
    GDB也提供了GIT镜像:
    git clone git://sourceware.org/git/gdb.git
    取得最新的GDB代码,而在取得源码用目录中用:
    git pull
    就可以更新源码。
    
    
    2.基本编译
    编译之前请安装texinfo,libncurses5-dev, m4, flex 和 bison这5个包。
    最基本的GDB编译非常简单,和编译大部分软件一样。
    创建一个用来编译GDB的目录:
    mkdir bgdb
    进入这个目录:
    cd bgdb
    config,其中../gdb/是GDB源码的目录:
    ../gdb/configure
    然后就是编译:
    make
    编译后安装:
    make install
    其中比较关键的地方就是config,其决定了后面编译出什么样的GDB。
    
    如果想设置编译好的GDB到一个指定目录,可以用:
    ../gdb/configure  --prefix=$HOME
    使用这个configure,可以让GDB安装到当前用户的home目录。
    
    也可以在编译的时候指定CFLAGS,可以用:
    ../gdb/configure CFLAGS=-g
    使用这个configure,编译出的GDB没有打开O2选项。
    
    
    3.编译支持其他体系结构的GDB
    前面介绍的config方式都是编译当前体系结构的,有时候我们需要在本机(X86)上跑一个支持别的体系结构的GDB,这样可以分析那个平台的二进制文件,CORE文件以及对那个平台的的程序进行远程调试。可以这样用:
    ../gdb/configure --target=amd64-linux
    这样编译出的GDB就可以支持AMD64的GDB,编译安装的时候,GDB的执行文件会被命名为amd64-linux-gdb。
    
    但是这样编译会有个小问题,如果需要使用多个体系结构的GDB,则需要每个平台都编译一个GDB,这有点麻烦,所以我比较喜欢使用的是另一种方法配置:
    ../gdb/configure --enable-targets=all --enable-64-bit-bfd
    这样的GDB可以直接支持了全部他可以支持的体系结构和文件结构。
    其中--enable-targets=all是让GDB打开对所有体系结构支持。
    而--enable-64-bit-bfd是设置bfd为64位模式,这样才能支持64位的二进制文件比如说amd64,不过比较新的bfd中,当设置的target是64位或者打开--enable-targets=all的时候,不需要设置会自动打开这个选项,不过保险起见还是打开。
    这样编译出的GDB就能支持GDB支持的全部体系结构了。
    当然用起来有个问题就是,因为支持的体系结构太多,可能有一些二进制文件会同时符合若干种格式,打开这类文件的时候GDB会显示:
    "xxx": not in executable format: File format is ambiguous.
    Matching formats: elf32-bigmips elf32-bigmips-vxworks elf32-tradbigmips.
    Use "set gnutarget format-name" to specify the format.
    这时你就可以根据提示,用set gnutarget format-name从列表中选择正确的格式,然后再用file命令打开这个文件,就可以了。
    
    
    4.交叉编译
    如果想在本地编译一个GDB而要在其他体系结构的平台上下使用,首先需要本地交叉编译环境可用,可以编译出可以在目标平台上运行的可执行文件,然后:
    ../src/configure --host=mips64-linux --enable-64-bit-bfd
    CC=mips64-linux-gcc LD=mips64-linux-ld AR=mips64-linux-ar
    这样GDB就能编译出一个可以在mips64-linux上使用的GDB。
    
    
    5.cvs update -d
    前面提过更新CVS目录,要使用cvs update,而cvs update
    -d是不建议使用的命令,因为当增加-d选项的时候,cvs会把源码仓库中所有文件都取回来,完成后src目录中不光有原来的目录,还增加了binutils,tk,
    ld 等一大堆其他软件的目录。
    如果你希望同时使用sourceware里面这些软件的最新版本,你可以使用这个源码树,如果你不想使用这样的源码树,则请直接看下一节。
    我对这个目录建议的配置是:
    ../gdb/configure --disable-sid --disable-rda --disable-gdbtk
    --enable-targets=all --enable-64-bit-bfd
    其中--enable-targets=all --enable-64-bit-bfd上一节已经介绍过,不再介绍。
    --disable-sid --disable-rda禁止了2个不太常用且编译比较慢的软件。
    --disable-gdbtk禁止了GDB图形扩展insight的编译,其实这个软件还是相当好用的,
    这个图形扩展可以同时打开命令行,看源码的时候还能随时切换成汇编。但其有一个问题
    是跟GDB源码的联系其实非常紧密,一旦GDB一些源码作了更新,其的编译就会受到影响,
    再加上维护者不多,所以一旦编译不过就需要等上几天,这种情况一年能碰上几次,几率也
    不算很高。当然如果不介意的话,可以在config的时候去掉--disable-gdbtk,
    并安装包libx11-dev,编译如果发现问题可以报到邮件列表insight@sourceware.org
    这样开发者可以更快的修复问题。
    
    
    6.写在最后
    前面介绍过的config参数可以同时使用,大家可根据需要灵活组合。
    

     

  •  

    演讲者:朱辉(teawater),GDB coder。

    简介:演示如何使用GDB通过Linux Kernel GDB tracepoint module(https://code.google.com/p/kgtp/) 对Linux Kernel进行调试。

     

    演讲稿

     

    视频地址

  • 演讲者: GCC/LLVM 移植/维护/优化

    简介:通过一个虚拟的基于MIPS-based CPU的完整实例来讲解如何Port整套GNU ToolChain,希望能更好的帮助想入门的人入门,让更多的想参与的人参与到GNU ToolChain的社区里来。

    演讲稿

  • 演讲者:袁鹏,编译器爱好者,关注多核处理器和程序性能。

    简介:爱分配,爱释放,爱泄漏

    我不是BUG

    我只是一个C库中的普通函数

    看过很多程序的崩溃,所以更珍惜自身的设计

    我是malloc

    我只想把内存制服

    你知道malloc的背后发生了那些故事吗?在本次报告中,我将以malloc为例,从"处理器/操作系统/编译器/运行时"的角度来探讨系统的内存管理机制,涉及到内存分配函数的设计权衡、性能评测以及错误检测等。多核已经无处不在,malloc又如何做到可扩展呢?

    演讲稿

    gnu,hellogcc,malloc

  • 演讲者:邢明杰,GCC贡献者,喜欢自由软件,对GCC比较感兴趣。

    简介:介绍自己写的几个小工具,用来将gcc的tree dump文件,汇编文件转换成可以图形化显示的vcg格式,从而可以在vcgview工具中图形显示控制流图。讨论如何通过gcc插件功能来实现更强大的图形化功能。

    演讲稿

    演讲代码

    视频地址

    gcc,gnu,hellogcc