为什么在执行远程提取时在libgit2中命中assert

时间:2019-01-27 01:32:00

标签: libgit2

我正在尝试与libgit2合并,并且在执行remote_fetch或create_annotated_commit之后执行git_repository_free时,我总是会点击此断言

但是我不知道我做错了什么?并且没有生成libgit错误。而且我也不明白这个断言的含义。

典型的调用堆栈如下:

2  __GI_abort              abort.c       90  0x7f35da541f5d 
3  __assert_fail_base      assert.c      92  0x7f35da537f17 
4  __GI___assert_fail      assert.c      101 0x7f35da537fc2 
5  git_mwindow_put_pack    mwindow.c     106 0x7f35db69725f 
6  pack_backend__free      odb_pack.c    565 0x7f35db6a3dda 
7  odb_free                odb.c         679 0x7f35db69d5c4 
8  git_odb_free            odb.c         696 0x7f35db69d67c 
9  set_odb                 repository.c  95  0x7f35db6d40c3 
10 git_repository__cleanup repository.c  150 0x7f35db6d42a3 
11 git_repository_free     repository.c  161 0x7f35db6d42da 
12 GitEngine::~GitEngine   GitEngine.cpp 268 0x556a9e4f067d 
13 main                    main.cpp      24  0x556a9e4eed8e 

要重现此问题,我只需要这样做:

    git_remote *remote;
    int err = git_remote_create(&remote, m_repo, "remotefetch", "./repoD/");
    git_fetch_options fetch_opts = GIT_FETCH_OPTIONS_INIT;
    if (err) {
        qDebug() << "error";
    }
    err = git_remote_fetch(remote, nullptr, &fetch_opts, nullptr);
    if (err) {
        qDebug() << "error";
    }

    if (m_repo) //this is in the destructor 
    git_repository_free(m_repo);

如果我将git_remote_create替换为git_remote_create_anonymous,问题将消失。

但是,带有git_remote_create_anonymous的事件,如果稍后在git_repository_free之前调用git_annotated_commit_from_fetchhead,我将再次命中相同的断言。我不知道为什么?我用命令行检查了git存储库,合并似乎正确执行了。

1 个答案:

答案 0 :(得分:1)

当库本身已经处置了其内部全局状态时,有时会发生这种情况,该状态由git_libgit2_init配置并由git_libgit2_shutdown破坏。

在调用任何libgit2函数之前,您必须 调用git_libgit2_init。完成后,您应该呼叫git_libgit2_shutdown。 (尽管如果您只是关闭应用程序,则不必这样做,操作系统将关闭所有打开的资源。)

但是,在调用git_libgit2_shutdown之后,您绝不能调用任何libgit2函数。这样做将尝试引用释放的资源。您的堆栈跟踪提示您在调用git_libgit2_shutdown之前先调用git_repository_free

如果您颠倒了这些呼叫的顺序,那么一切都会好起来的。