Отладка ошибки доступа к libleveldb с помощью C # в OSX - PullRequest
0 голосов
/ 02 мая 2018

Интересующий меня проект C # использует leveldb через PInvoke 'wrapper' , который прекрасно работает как в Windows, так и в Linux, но выдает следующую ошибку в OSX.

src / tcmalloc.cc: 331] Попытка освободить недопустимый указатель 0x7f83cb954a00

Минимальный пример для воспроизведения ошибки:

using System;
using System.Runtime.InteropServices;

namespace leveldb_test2
{
    internal static class Native {
        [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        public static extern IntPtr leveldb_options_create();
    }

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("before");
            IntPtr handle = Native.leveldb_options_create();
            Console.WriteLine("after");
        }
    }
}

Что я пробовал

  • Построение вручную leveldb

    Leveldb изначально устанавливался с помощью homebrew. Не зная, делают ли они что-нибудь волшебное, я также сделал ручную сборку, которая выдала мне ту же ошибку.

  • Проверка подписи метода

    Подпись метода, используемая с DllImport, выглядит нормально, поскольку она идентична той, что используется в проекте-оболочке, который я нашел: leveldb-sharp (fwiw; я пытался использовать этот проект, та же ошибка)

    Обратите внимание, что исходный экспорт из leveldb extern leveldb_options_t* leveldb_options_create();

    Я также создал свой собственный dll с той же подписью, и он работал нормально Это также подтвердило для меня, что я могу правильно установить, какой именно файл библиотеки загружается, чтобы избежать его, используя какую-то неработающую версию где-то еще в моей системе.

  • Проверка экспорта библиотеки

    Я выгрузил экспорт, используя nm, чтобы убедиться, что искажение имени не происходит, кажется, хорошо. Я также могу получить доступ к библиотеке с помощью ctypes в Python.

  • Попробуйте старые версии leveldb

    Я пробовал все старые версии до 1.15 с сентября 2014 года. Все выдают одну и ту же ошибку.

Что дальше

В идеале я хотел бы иметь возможность отлаживать нативную сторону. Однако, в отличие от Visual Studio в Windows, OSX Visual Studio Community Edition не имеет опции «Включить отладку собственного кода», описанной здесь . Итак, мой вопрос

Как мне отладить нативную сторону при инициализации из C #?

Я считаю, что последняя часть этого вопроса важна, потому что, как уже было сказано, она отлично работает при запуске из Python. Любые советы / советы / помощь очень ценятся!

PS: бонусом будет решение заставить упаковщик работать.

...