在BerkeleyDB上获取线程EXC_BAD_ACCESS示例代码

时间:2018-05-08 14:15:20

标签: c malloc

我正在编写我的第一个C程序,我的确做得很好。该应用程序与RESTful服务器通信。一切都很好,直到我决定使用嵌入式数据库(libdb)进行存储。我在下面得到了这个代码,这是我整个程序的一部分。我的问题是它继续崩溃:

my_archive-> db_home_dir = DEFAULT_HOMEDIR;

我以为我的堆栈已经用完所以我将所有冗长的变量malloc,但问题仍然存在,所以我决定将这个libdb部分分成新的代码,但问题仍然存在。

知道这里出了什么问题吗?

P.S。我正在Xcode中进行所有编码,并在main()之后立即调试断点后逐步执行每一行。总是在同一错误行上结束。或许我只是不知道自己在做什么。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <ctype.h>
#include <time.h>
#include "db.h"

#define DEFAULT_HOMEDIR "/Users/mark/Documents/bdb/"
#define URLSDB "urls"


typedef struct archive_dbs {
    DB *URLS_dbp;
    char *db_home_dir;
    char *URLS_db_name;
} ARCHIVE_DBS;


void initialize_archivedbs(ARCHIVE_DBS *my_archive)
{
    my_archive->db_home_dir = DEFAULT_HOMEDIR; //CRASHES HERE: Thread 1: EXC_BAD_ACCESS (code=2, address=0x1000061da)
    my_archive->URLS_dbp = NULL;
    my_archive->URLS_db_name = NULL;
}

void set_db_filenames(ARCHIVE_DBS *my_archive)
{
    size_t size;
    size = strlen(my_archive->db_home_dir) + strlen(URLSDB) + 1;
    my_archive->URLS_db_name = malloc(size);
    snprintf(my_archive->URLS_db_name, size, "%s%s", my_archive->db_home_dir, URLSDB);
}


int open_database(DB **dbpp, const char *file_name, const char *program_name, FILE *error_file_pointer)
{
    DB *dbp;
    u_int32_t open_flags;
    int ret;

    ret = db_create(&dbp, NULL, 0);
    if (ret != 0) {
        fprintf(error_file_pointer, "%s: %s\n", program_name,
                db_strerror(ret));
        return(ret);
    }
    *dbpp = dbp;
    dbp->set_errfile(dbp, error_file_pointer);
    dbp->set_errpfx(dbp, program_name);
    open_flags = DB_CREATE;
    ret = dbp->open(dbp,
                NULL,
                file_name,
                NULL,
                DB_BTREE,
                open_flags,
                0);
    if (ret != 0) {
        dbp->err(dbp, ret, "Database '%s' open failed.", file_name);
        return(ret);
    }

    return (0);
}

int databases_setup(ARCHIVE_DBS *my_archive, const char *program_name, FILE *error_file_pointer)
{
    int ret;
    ret = open_database(&(my_archive->URLS_dbp), my_archive->URLS_db_name, program_name, error_file_pointer);
    if (ret != 0)
        return (ret);
    printf("databases opened successfully\n");
    return (0);
}

int databases_close(ARCHIVE_DBS *my_archive)
{
    int ret;
    if (my_archive->URLS_dbp != NULL) {
        ret = my_archive->URLS_dbp->close(my_archive->URLS_dbp, 0);
        if (ret != 0)
            fprintf(stderr, "URLS database close failed: %s\n",
                    db_strerror(ret));
    }

    printf("databases closed.\n");
    return (0);
}


int main(void){


    ARCHIVE_DBS *archivedbs;
    initialize_archivedbs(archivedbs);
    set_db_filenames(archivedbs);
    databases_setup(archivedbs, "urlfetcher", NULL);
    open_database(&archivedbs->URLS_dbp, "URLS.db", "urlfetcher",
              NULL);
    databases_close(archivedbs);




    }

0 个答案:

没有答案