-
探索GDB的移植
日期:2011-06-09 | 分类: |
GDB已经被移植到到十几个处理器和平台上,足以证明GDB的结构是便于移植的。本文简单介绍了,作者在移植GDB的过程中,使用和修改的一些GDB hook函数,从而进一步理解这些hook函数的作用。
http://filer.blogbus.com/11149686/resource_11149686_1307586989v.pdf
幻灯片就是上周活动时候用的,加了一点点小的修改。
-
GNU Toolchain的起步工作 -- 利用clang-analyzer分析gdb
日期:2011-03-18 | 分类:使用技巧 |
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。
-
开始加入gnu toolchain的开发(之二)
日期:2011-01-26 | 分类:文档 |
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 | 分类:文档 |
作者: 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也不是不可能的事情。 -
用MSYS编译最新版本的GDB(git更新)(主要针对WIN平台)
日期:2011-01-06 | 分类:文档 |
原文地址 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,并且编译成功!
- 假设我的python的安装目录是F:\cb\python271,头文件所在的目录是:F:\cb\python271\include,于是,你在这个目录里面,新建一个名字叫做 python2.7 的目录,也就是说,创建一个 “F:\cb\python271\include\python2.7”,然后你把原来“F:\cb\python271\include”里面的内容,都复制一份,放到这个python2.7的目录里面。 (因为gdb默认会去检索这个目录的头文件,也许linux下的目录结构是这样的吧。。)
- 修改库文件,在路径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的编译问题。
参考链接
- http://dev.zhourenjian.com/blog/2009/03/11/compiling-gdb-debugger-in-windows.html
- 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 | 分类:文档 |
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参数可以同时使用,大家可根据需要灵活组合。
-
HelloGCC Worshop China 2010(6)Linux Kernel GDB tracepoint module演示
日期:2010-11-10 | 分类:活动记录 |
演讲者:朱辉(teawater),GDB coder。
简介:演示如何使用GDB通过Linux Kernel GDB tracepoint module(https://code.google.com/p/kgtp/) 对Linux Kernel进行调试。
-
HelloGCC Worshop China 2010(5)How To Port GNU ToolChain
日期:2010-11-10 | 分类:活动记录 |
演讲者: GCC/LLVM 移植/维护/优化
简介:通过一个虚拟的基于MIPS-based CPU的完整实例来讲解如何Port整套GNU ToolChain,希望能更好的帮助想入门的人入门,让更多的想参与的人参与到GNU ToolChain的社区里来。
-
HelloGCC Worshop China 2010(4)内存管理机制与优化
日期:2010-11-10 | 分类:活动记录 |
演讲者:袁鹏,编译器爱好者,关注多核处理器和程序性能。
简介:爱分配,爱释放,爱泄漏
我不是BUG
我只是一个C库中的普通函数
看过很多程序的崩溃,所以更珍惜自身的设计
我是malloc
我只想把内存制服
你知道malloc的背后发生了那些故事吗?在本次报告中,我将以malloc为例,从"处理器/操作系统/编译器/运行时"的角度来探讨系统的内存管理机制,涉及到内存分配函数的设计权衡、性能评测以及错误检测等。多核已经无处不在,malloc又如何做到可扩展呢?

-
HelloGCC Worshop China 2010(3)GCC编译器图形化实现与讨论
日期:2010-11-10 | 分类:活动记录 |








