C++ SQLite注册VFS会导致分段错误
我正在尝试在SQLite中注册一个:C++ SQLite注册VFS会导致分段错误,c++,sqlite,C++,Sqlite,我正在尝试在SQLite中注册一个: #include <iostream> #include "sqlite3.h" int vfs_open(sqlite3_vfs* vfs, const char *zName, sqlite3_file* file, int flags, int *pOutFlags) { std::cout << "Hello open"; return SQLITE_OK; } int vfs_access(sqlite3_vfs
#include <iostream>
#include "sqlite3.h"
int vfs_open(sqlite3_vfs* vfs, const char *zName, sqlite3_file* file, int flags, int *pOutFlags)
{
std::cout << "Hello open";
return SQLITE_OK;
}
int vfs_access(sqlite3_vfs* vfs, const char *zName, int flags, int *pResOut)
{
std::cout << "Hello access";
return 0;
}
int main () {
static sqlite3_vfs vfs;
vfs.iVersion = 1;
vfs.szOsFile = 1000;
vfs.zName = "foo";
vfs.xOpen = vfs_open;
vfs.xAccess = vfs_access;
sqlite3_vfs_register(&vfs, 0);
sqlite3 *db;
sqlite3_open_v2("db.db", &db, SQLITE_OPEN_READONLY, "foo");
}
我做错了什么,有什么帮助吗?sqlite3\u vfs结构有很多函数的指针。我找不到关于您必须定义的最小函数集的任何文档,因此假设它们都是必需的,甚至是存根函数,可能更安全一些
在您的例子中,我猜sqlite正在调用一个您尚未定义的函数(可能是
xFullPathname
),导致尝试以NULL值运行函数。sqlite 3\u vfs结构具有许多函数的指针。我找不到关于您必须定义的最小函数集的任何文档,因此假设它们都是必需的,甚至是存根函数,可能更安全一些
在您的情况下,我猜sqlite正在调用一个您尚未定义的函数(可能是
xFullPathname
),导致尝试以NULL值运行函数。有几点建议-可能在崩溃之前没有刷新跟踪写入,请使用std:endl
刷新它们。还有很多方法没有在您的结构中定义,可能sqlite正在调用其中一种方法(xFullPathname
springs),您可能需要为其余方法添加虚拟函数。我找不到关于您必须定义的最小函数集的任何文档。@TheDark:这是一个很好的例子。提供一个虚拟的xFullPathname
实现会使程序不再崩溃,但同时我仍然看不到来自vfs\u open
的打印。OP可能应该检查sqlite3\u open\u v2的返回值。顺便说一句:您可能希望在带有调试符号的一侧编译您自己的SQLite,以便找出它在您没有的VFS函数上崩溃的地方-这就是我所做的。@TheDark-thanking,这确实起到了作用。请回答,我可以给你+1。一些建议-可能你的跟踪写入在崩溃之前没有被刷新,请使用std:endl
刷新它们。还有很多方法没有在您的结构中定义,可能sqlite正在调用其中一种方法(xFullPathname
springs),您可能需要为其余方法添加虚拟函数。我找不到关于您必须定义的最小函数集的任何文档。@TheDark:这是一个很好的例子。提供一个虚拟的xFullPathname
实现会使程序不再崩溃,但同时我仍然看不到来自vfs\u open
的打印。OP可能应该检查sqlite3\u open\u v2的返回值。顺便说一句:您可能希望在带有调试符号的一侧编译您自己的SQLite,以便找出它在您没有的VFS函数上崩溃的地方-这就是我所做的。@TheDark-thanking,这确实起到了作用。请回答,我可以给你+1。
$ g++ test.cc libsqlite3.dylib
$ ./a.out
Segmentation fault: 11