关于cgdb的源码安装,以及如何用cgdb调试应用程序

Feb 23, 2010

前面已经说过用vim + cgdb作开发环境的事了,假期在家的时候因为家里的电脑上网时是被绑定的,我的笔记本不能联网,所以只能先下载源码包,然后转到笔记本上安装,安装的过程出现了两个依赖问题(如果你用apt-get,会自己解决依赖问题):

1.libncurses5-dev的缺失。可以在http://packages.ubuntu.com/jaunty/i386/libncurses5-dev/download选择相应的源下载。(找这个网址差点把我找吐血。。。)。
注:上述网址只适用于ubuntu 9.04,如果是别的版本,相应的,变换版本代号就行了,如ubuntu 8.04就是http://packages.ubuntu.com/hardy/i386/libncurses5-dev/download

2.安装libncurses5-dev时的readline依赖问题

解决:

wget http://ftp.gnu.org/gnu/readline/readline-5.2.tar.gz  #下载readline
tar zxvf readline-5.2.tar.gz  #解压
wget  http://www.linuxfromscratch.org/patches/lfs/6.4/readline-5.2-fixes-5.patch  #下载补丁
cd readline-5.2

重新安装 Readline 会将老的库libraryname重命名为.old。然而着并不是一个问题。在某些情况下它会引发 ldconfig 的一个链接 bug。应用下面的两个sed命令可以避免这种情况:

sed -i '/MV.*old/d' Makefile.in
sed -i '/{OLDSUFF}/c:' support/shlib-install

Readline 有一个处理非多字节时导致不正确的显示计算和不正确的重新显示。通过应用下面的补丁来修复这个问题:

patch -Np1 -i ../readline-5.2-fixes-5.patch

下面开始编译,安装:

./configure --prefix=/usr --libdir=/lib
make SHLIB_LIBS=-lncurses  #SHLIB_LIBS=-lncurses    这个选项强制 Readline 不链接到 libncurses 库。(事实上是,libncursesw)
make install

将静态库移动到一个更合理的位置:

mv -v /lib/lib{readline,history}.a /usr/lib

接下来,删除 /lib 中的 .so 文件,并将它们重新连接到 /usr/lib 中:

rm -v /lib/lib{readline,history}.so
ln -sfv ../../lib/libreadline.so.5 /usr/lib/libreadline.so
ln -sfv ../../lib/libhistory.so.5 /usr/lib/libhistory.so

注:可能有些文件提示不存在,你大可不用理会。 真的很麻烦,直接apt-get install cgdb最简单了,当然,我这么麻烦的安装也是条件所迫啊... :+q

好了,安装完之后,我用cgdb打开编译好的程序nginx,可是发现代码区没有东西,我很纳闷。。。后来在看csapp的《链接》终于了解到其中的原委:一个典型的ELF可执行目标文件是由.init, .text, .rodata, .data, .bss, .symtab, .debug, .line, .strtab等段构成的,其中.debug是一个调试符号表,.line是原始C程序的行号到.text节中的机器指令之间的映射。两者都是debug不可或缺的东西,而且他们只有以-g选项调用编译驱动程序时才会得到。很简单的,联想到是不是nginx源程序编译时没有调用-g选项。

进去nginx源码目录,用--configure --help 查看相关内,了解到添加编译选项的命令是

--with-cc-opt=[编译选项]

如是,剩下的就很简单了,在nginx的configure程序中在加上

--with-cc-opt=-g

即可,再次用cgdb打开编译后的nginx可执行程序(在objs目录下),可以看见代码了。 至于cgdb的使用,跟gdb差不多,可以看看帮助文件。

Comments

  1. 你好,请问为什么在cgdb下输入无法终止呢?
    已确定gdb下可以中止。
    谢谢。

    Avatar
    • 貌似cgdb的输入就没有好用过,最还是将输入的内容提前存在一个变量里面吧...

      Avatar
    • 貌似ESC后按T可以新开一个tty专门用来输入,
      我一开始是直接输入得。。。没想到和gdb不一样

      Avatar

Get In Touch With Us ...