【发布时间】:2011-04-24 15:18:03
【问题描述】:
我编写了一个程序,它在 C/C++ 中使用 Berkeley DB,就像一个混合体。 我有一个使用这种方法的名为 bdb 的类。
int open(char *db_name)
{
flags = DB_CREATE;
u_int32_t envCreateFlags = DB_CREATE |
DB_INIT_LOCK|
DB_INIT_LOG|
DB_INIT_MPOOL|
DB_INIT_TXN|
DB_RECOVER |
DB_THREAD;
ret = db_env_create(&dbenv, 0);
dbenv->err(dbenv,ret,"err db_env_create ");
ret = dbenv->open(dbenv,"./",envCreateFlags,0);
dbenv->err(dbenv,ret,"err db_env_open ");
ret = db_create(&dbp,dbenv, 0);
dbp->err(dbp,ret,"err db_create ");
ret = dbp->open(dbp, /* DB structure pointer */
NULL, /* Transaction pointer */
db_name, /* On-disk file that holds the database. */
NULL, /* Optional logical database name */
DB_BTREE, /* Database access method */
flags, /* Open flags */
0); /* File mode (using defaults) */
dbp->err(dbp,ret,"err dbp open ");
return ret;
};
所以接下来在程序中我将使用类似的方法
int getEntry( char *url ,unsigned int *fp)
{
DBT key, data;
DBC *cursorp;
dbp->cursor(dbp, NULL, &cursorp, 0);
memset(&key, 0, sizeof(DBT));
memset(&data, 0, sizeof(DBT));
key.data = fp;
key.ulen = sizeof(unsigned int);
key.flags = DB_DBT_USERMEM;
data.data = url;
data.ulen = sizeof(char) * maxUrlSize;
data.flags = DB_DBT_USERMEM;
ret = cursorp->c_get(cursorp, &key,&data, DB_PREV);
if (cursorp != NULL)
cursorp->close(cursorp);
if (ret == DB_NOTFOUND)
return -1;
}
所以,对象被创建,然后地址被分配给多个线程。 他们都可能同时进行 getEntry 和 checkUpdate..
结果是每次启动程序后得到的
PANIC: fatal region error detected; run recovery
PANIC: fatal region error detected; run recovery
我在线路上遇到了分段错误
ret = cursorp->c_get(cursorp, &key,&data, DB_PREV);
不知道为什么?
【问题讨论】:
-
您能否在调试器中运行您的程序以查看它实际失败的地方,并尝试将代码简化为一个更短的示例?
-
当然,你不知道如何在不丢失信息的情况下缩短代码... :-/希望它没问题
标签: c++ c berkeley-db