Получение темы EXC_BAD_ACCESS на примере кода BerkeleyDB - PullRequest
0 голосов
/ 08 мая 2018

Я пишу свою самую первую программу на C, и у меня все было хорошо. Приложение общается с сервером RESTful. Все было хорошо, пока я не решил использовать встроенную базу данных (libdb) для хранения. Я получил этот код ниже, который был частью всей моей программы. Моя проблема в том, что он продолжает сбой на этой линии:

my_archive-> db_home_dir = DEFAULT_HOMEDIR;

Я думал, что у меня заканчивается стек, поэтому я перебил все мои длинные переменные, но проблема все еще возникала, поэтому я решил разделить эту часть 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);




    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...