zoukankan      html  css  js  c++  java
  • [笔记]如何在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)的代码打包上传在这里了。

  • 相关阅读:
    mongo批量删除js示例
    Mongo压测介绍
    线性代数学习笔记(1)--二维向量点积本质(仅供自己理解)
    墨菲定律的正确解读
    spring cloud 2020.0.1踩坑记录-bootstrap不生效等
    记一次网络质量原因导致接口调用超时的调查过程
    .NET Debugging Demos Lab 2: Crash
    .NET Debugging Demos Lab 3: Memory
    Hang caused by GC
    .NET Debugging Demos Lab 4: High CPU hang
  • 原文地址:https://www.cnblogs.com/journeyonmyway/p/2545334.html
Copyright © 2011-2022 走看看