工欲善其事,必先利其器。
首先需要安装一下额外的工具包,一个是 libc6-dbg,这是带有debug symbol信息的 libc.so;另一个是libc6-dev,这是glibc的源代码,获取之后我们就可以在gdb中查看代码了。

在Ubuntu/Debian 系统上,我们可以通过以下2条命令获得:

$sudo apt-get install libc6-dbg
$sudo apt-get source libc6-dev

在Fedora/Red Hat 系的OS上,需要安装的软件包的名字不叫 libc6-dbg,libc6-dev,貌似应该是glibc-debuginfo。

之后,以一段小程序为例来演示整个过程,小程序包含了一个系统调用fork(),一个库函数printf()

01 #include
02 #include
03 int main(){
04     pid_t son;
05     if((son=fork())==0)
06         printf("I am son\n");
07     else
08         printf("I am farther\n");
09     return 0;
10 }

接着,编译产生带有调试信息的可执行文件 $gcc -g -o f fork.c

然后开启gdb调试 $gdb f

在开始调试之前,需要指定一下刚刚获得的带有libc6-dev源码文件夹的路径,比如我把这些源码放在了 ~/glibc/lib文件夹下,通常一般程序需要的是stdio-common这个目录内的文件,于是输入: (gdb) directory ~/glibc/lib/stdio-common

注意看其中几条命令的用法。
程序在调用fork函数后,其实执行的是glibc包装过的__libc_fork ,并且我们可以查看其源代码。
这里有几个常用命令:
s 单步执行;
list 查看源代码;
start 程序开始执行,并在main函数处停下,相当于在main处加断点。

但是在执行了几步之后出现了这样的错误:
_IO_list_lock () at genops.c:1299
1299 genops.c: No such file or directory.
in genops.c

这是因为gdb没有找到genops.c文件,我们需要像刚才一样,用directory命令指明路径。
怎么知道路径呢?很简单,在刚刚获得的libc6-dev源码目录下搜索genops.c文件,然后拷贝路径就可以了。
(gdb)directory ~/glibc/lib/libio
之后就可以正常执行了。

最后特别感谢一下 Dave 同学,在邮件列表里帮助我解决了不少困惑。
这里是一篇参考资料,来自blogspot,如何访问你懂的。

Tags: ,. 22,041 views
Home

4 Comments so far

Trackbacks/Pingbacks

Leave a comment

Name(required)
Mail (required),(will not be published)
Website(recommended)

Fields in bold are required. Email addresses are never published or distributed.

Some HTML code is allowed:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
URLs must be fully qualified (eg: http://blog.nlogn.cn),and all tags must be properly closed.

Line breaks and paragraphs are automatically converted.

Please keep comments relevant. Off-topic, offensive or inappropriate comments may be edited or removed.