http://blog.nlogn.cn/trace-glibc-by-using-gdb/

工欲善其事,必先利其器。
首先需要安装一下额外的工具包,一个是 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,如何访问你懂的。

————————————————————————————————

原创文章,转载请注明出处。 转载自Just for Fun

本文链接地址: 用GDB追踪glibc代码执行过程


Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐