[笔记]如何在VC中调试SQLite源代码

心血来潮下载了SQLite源代码(版本 3.7.12.1),解压后只有4个文件:sqlite3.h,sqlite3ext.h,shell.c,sqlite3.c,简单粗暴我喜欢。

按照文档介绍,写了个最简单的demo程序如下:

// The name of a database is given by the first argument and 

// the second argument is one or more SQL statements to execute against the database.



#include <stdio.h>

#include "sqlite3.h"



static int callback(void *NotUsed, int argc, char **argv, char **azColName){

    int i;

    for(i=0; i<argc; i++){

        printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");

    }

    printf("\n");

    return 0;

}



int main(int argc, char **argv){

    sqlite3 *db;

    char *zErrMsg = 0;

    int rc;



    if( argc!=3 ){

        fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv[0]);

        return(1);

    }



    rc = sqlite3_open(argv[1], &db);

    if( rc ){

        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));

        sqlite3_close(db);

        return(1);

    }

    rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);

    if( rc!=SQLITE_OK ){

        fprintf(stderr, "SQL error: %s\n", zErrMsg);

        sqlite3_free(zErrMsg);

    }

    sqlite3_close(db);



    return 0;

}

想在VC2010中调试下sqlite3.c,就在调用sqlite3_open()处打了个断点,结果发现跟进去的位置好古怪,完全不是正确的地方。

搜到liigo的一篇文章“VC6/VC2005均不支持行数超过65536的C/C++源代码文件”,而当前sqlite3.c文件共136692行,看来VC2010仍然不支持过长的文件。

为了将sqlite3.c的行数压缩到65535行以内,有如下2个方案:

 

方案1:删除注释行、空行、#if 0 ... #endif

仅将注释行删除是不够的,即使将空行都删除也不够,再加上删除#if 0 ... #endif,勉强挤到了66675行。

懂正则表达式的话,上述操作其实不难。

虽然仍然超出65535一些,但是只要调试的代码行不要太靠后,大体上还是满足调试需求的。

 

方案2:拆分源文件为几部分,再通过#include的方式将其嵌入

源文件sqlite3.c文件共136692行,因为136692/65535=2.086,所以可以将此文件拆为3部分,主文件sqlite3.c,及两个子文件 sqlite3_1.h 和 sqlite3_1.h,调用方法为主文件sqlite3.c在最后#include另外两个子文件,如下:

...

#include "sqlite3_1.h"

#include "sqlite3_2.h"

 

为什么sqlite3.c文件这么大?

根据官网的说法,该文件是将多个文件(Sqlite核心文件及FTS3 和 RTREE 扩展)整合(amalgamation)为一个单独的文件的,据说这样可以让编译器达成更充分的优化,从而提高5%-10%的效率。

 

代码下载

为方便下载,我已经将Sqlite源代码(sqlite-amalgamation-3071201) + 方案1(sqlite3_no_comment) + 方案2(sqlite3_split)的代码打包上传在这里了。

你可能感兴趣的:(sqlite)