Интересующий меня проект 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: бонусом будет решение заставить упаковщик работать.