[メモ]VCでSQLiteソースコードをデバッグする方法

6451 ワード

心血来潮はSQLiteのソースコード(バージョン3.7.12.1)をダウンロードして、解凍した後に4つのファイルだけあります:sqlite 3.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
", azColName[i], argv[i] ? argv[i] : "NULL"); } printf("
"); 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
", argv[0]); return(1); } rc = sqlite3_open(argv[1], &db); if( rc ){ fprintf(stderr, "Can't open database: %s
", 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
", zErrMsg); sqlite3_free(zErrMsg); } sqlite3_close(db); return 0; }

VC 2010でsqlite 3をデバッグしたいです.c、sqlite 3を呼び出しています.Open()でブレークポイントを打ったところ、フォローする位置が変で、全く正しい場所ではないことがわかりました.
liigoの記事「VC 6/VC 2005はいずれも65536を超えるC/C++ソースファイルをサポートしていません」を検索し、現在のsqlite 3.cファイルは136692行で、VC 2010はまだ長すぎるファイルをサポートしていないようです.
sqlite 3.cの行数は65535行以内に圧縮され、以下の2つのスキームがある.
 
シナリオ1:コメント行、空行、#if 0...#を削除endif
コメント行のみを削除するだけでは足りません.空の行を削除しても足りません.削除#if 0...#endifは、無理に66675行まで押し込んだ.
正規表現を知っていれば、上記の操作は難しくありません.
65535を超えていますが、デバッグされたコード行があまり後ろに立たない限り、デバッグの要件はほぼ満たされます.
 
シナリオ2:ソースファイルをいくつか分割し、#includeで埋め込む
ソースファイルsqlite 3.cファイルは全部で136692行で、136692/65535=2.086なので、このファイルを3部分に分解することができて、メインファイルsqlite 3.c,および2つのサブファイルsqlite 3_1.hとsqlite 3_1.h、呼び出し方法メインファイルsqlite 3.c最後の#includeの他の2つのサブファイルは、以下の通りです.
...

#include "sqlite3_1.h"

#include "sqlite3_2.h"

 
なぜ?cファイルはこんなに大きいですか.
公式サイトの言い方によれば、このファイルは複数のファイル(SqliteコアファイルおよびFTS3およびRTREE拡張)を1つの単独ファイルに統合したものであり、コンパイラをより十分に最適化し、5%-10%の効率を向上させることができるという.
 
コードのダウンロード
ダウンロードを容易にするために、Sqliteソースコード(sqlite-amalgamation-3071201)+シナリオ1(sqlite 3_no_comment)+シナリオ2(sqlite 3_split)のコードパッケージをここにアップロードしました.