SQLite源代码编译调试

1.在msys上编译

本文介绍的是windows平台,所以首先要安装msys2环境,这里就不细说了,具体可以参考下面这篇文章:
https://blog.csdn.net/qiuzhiqian1990/article/details/56671839

一开始要下载源代码,官网地址如下
https://www.sqlite.org/download.html
选择包含全部源文件的版本,11.93M的那个
在这里插入图片描述
把下载的包解压,然后打开msys2进入到sqlite-src-3310100文件夹并执行./configure命令生成makefile。

接下来运行make命令,可以看到出错了,提示"/bin/sh: tclsh: 未找到命令",
在这里插入图片描述
这是因为没有安装tcl导致的,sqlite的编译需要依赖tcl脚本,所以要先安装tcl,我安装的是ActiveTcl 8.6,可以从以下地址下载:
https://www.cr173.com/soft/46330.html
我是安装在F:/Tcl目录下,安装后在cmd里输入命令tclsh,出现%说明安装成功,接下来在msys重新输入make命令,发现一大堆奇怪的错误,这是上次编译错误时残留导致的,所以要先make clean清理一下,然后再make就可以编译成功了。
在这里插入图片描述
这个编译出来的就是sqlite的shell版本。同时看到在工程目录下生成了一大堆编译的目标文件影响阅读,这时可以新建个文件夹在里面,比如
mkdir bld
cd bld
…/configure
make
然后编译的文件全都放在了bld文件夹下。

默认编译只会生成shell版本不会生成tcl版本,想要编译tcl版本需要在make时指定目标
make tclsqlite3.exe

2.在eclipse上编译

之前主要是做一些编译环境的验证,为了提高开发效率接下来把编译放在eclipse上做,先新建一个新工程,选择cygwin gcc
在这里插入图片描述
接下来在工程上右键新建文件夹,选择外部关联的方式,导入源码所在的文件夹
在这里插入图片描述
默认情况下SQLite是采用内建的自动编译,现在我们不能使用自动编译,要使用之前新建的bld文件夹下的makefile文件编译,在左边的工程名右键Properties按如下选择
在这里插入图片描述
在这里插入图片描述
编译目标选择tclsqlite3.exe,编译通过后现在来设置断点调试:
在这里插入图片描述
新建一个debug配置
在这里插入图片描述
按下面的配置,找到tclsqlite3.exe
在这里插入图片描述
接着设置路径映射,否则dubug时会找不到源文件,设置的e盘是工程所在目录
在这里插入图片描述
debug后输入puts命令发现没有打印
在这里插入图片描述
但是直接运行程序却是可以打印的
在这里插入图片描述
经过调试,确认为当前的gdb有问题,打开msys2查看gdb版本
在这里插入图片描述
我之前使用的是gdb 7.11.1-1 ,这个有问题,建议安装mingw-w64-i686-gdb 8.1-1,使用命令pacman -S mingw-w64-i686-gdb安装,安装后把调试的默认gdb换成mingw32目录下的gdb
在这里插入图片描述
路径根据安装的msys2路径自行修改,为了保险起见在cmd中输入F:\msys32\mingw32\bin\gdb.exe -v确定下该gdb的版本
在这里插入图片描述
可以看到该版本确实是我们需要的,再次debug输入puts命令,可以看到这个gdb可以正常输出了
在这里插入图片描述
接下来在src目录下的pager.c中的sqlite3PagerOpen函数里设个断点,运行如下命令sqlite3 db example1.db,发现断点停不下来,但是sqlite_build文件夹下已经生成了example1.db数据库文件,说明程序已经执行了该条指令,只是对应的源代码文件不对,经过一番摸索,知道sqlite会把所有源文件合成一个sqlite3.c文件,可以通过修改makefile使之不合并
在这里插入图片描述
把USE_AMALGAMATION = 1改成USE_AMALGAMATION = 0即可

碰到以上这个问题时,我是在工程主目录下的makefile编译的,现在我新建了bld文件夹编译后,debug时能单步调试,但是设置任何断点都无效,出现这个现象的原因是eclipse不支持根据相对路径设置断点,而编译的源文件是按照相对路径编译

在这里插入图片描述
如上图所示,按绝对路径在4005行设置断点不会停下来,按相对路径在4006行设置断点能够停下来,而eclipse设置断点就是按照绝对路径来设的。

解决方法是把原来的相对路径:
在这里插入图片描述
改为绝对路径TOP = /e/qxqb/open_source/sqlite-src-3310100即可。

sqlite源代码里通过一些宏来控制编译选项,如果想通过调试来学习,希望编译debug版本的代码,可以在makefile中做如下修改:
在这里插入图片描述
因为现在使用的是外部makefile编译,eclipse并不知道编译选项,由这些宏控制的代码是灰色的处于注释状态,所以在工程右键Properties里也添加一下,这样主要是为了阅读代码方便,本身不起编译作用。
在这里插入图片描述
现在重新在pager.c中的sqlite3PagerOpen函数里设个断点,输入sqlite3 db example1.db,代码运行到那里确实停下来了
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/pfysw/article/details/104716815