在一个大型工程里,往往需要依赖很多动态库(linux下是.so文件),我们只能调用动态库里的函数,却不能跟踪动态库中函数的具体实现流程和变量的值,要理解函数的功能一般都是看文档说明,有时候文档又说的不清楚,这个时候只能结合源码做一些猜测,但是源代码又错综复杂,在短时间内很难理解,所以要是能够单步调试源码并结合打印信息效果会好很多。
这篇文章就结合实例讲解在linux环境下怎么调试动态库,以sqlite3和tcl8.7为例,这2个工程的搭建参考
http://blog.youkuaiyun.com/pfysw/article/details/78629167
sqlite3作为主工程,tcl8.7作为动态库,现在要做的就是在sqlite3工程下调试tcl8.7源码。
如果之前编译安装过tcl8.7程序,会在/usr/local/lib文件夹下生成一个libtcl8.7.so的动态库,现在把它删除。
cd /usr/local/lib
rm libtcl8.7.so
因为默认是先调用/usr/local/lib的动态库,这么做的目的是希望使用工程内的libtcl8.7.so,之后可能会多次修改源码来调试,这样比较方便,编译好就可以调试了。当然也可以改makefile把生成的动态库换个名字。
我们现在要搭建的是eclipse工程,解压tcl8.7a1源码后,在tcl8.7a1/unix目录下执行./configure就可以了,剩下的编译工作就交给eclipse。
在eclipse新建c工程tcl8.7,把整个源码文件夹拷到工程目录下,更改unix目录下的makefile文件,修改点如下:
在第101行修改编译选项,把原来的optimize改为debug:
# To change the compiler switches, for example to change from optimization to
# debugging symbols, change the following line:
CFLAGS = $(CFLAGS_DEBUG)
#CFLAGS = $(CFLAGS_OPTIMIZE)
#CFLAGS = $(CFLAGS_DEBUG) $(CFLAGS_OPTIMIZE)
#CFLAGS = $(CFLAGS_OPTIMIZE) -pipe
在eclipse里配置编译环境,不使用自动生成makefile,使用源码里的makefile来编译,需要改3个地方:
编译前需在工程目录点右键clean一下,然后编译就可以在unix目录下看到生成的libtcl8.7.so文件了。
在sqlite3的工程里设置动态库的路径
在debug configuration里设置libtcl8.7.so的源码路径:
配置动态库的路径:
配置好后就可以调试了: