Segfault с использованием ccall в Julia, когда `GC.enable (true)` - PullRequest
0 голосов
/ 26 января 2019

У меня странная проблема, связанная с взаимодействием с общей библиотекой, и я получаю ошибки segfaults, когда пытаюсь использовать ccall.Я переписал свой код на Python, но не получил никаких проблем.Это также происходит только тогда, когда GC.enable(true).Если я запускаю GC.enable(false) до запуска какой-либо функции ccall, все работает нормально.

Как ни странно, когда я запускаю следующее:

GC.enable(false)
var1 = Ref(...)
var2 = pointer(...)
ccall(...)
GC.enable(true)

, оно все равно вызывает ошибки.

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

Кроме того, если кто-то может предложить предложения о том, как лучше всего использовать ccall в Julia при работе с разнымивиды шаблонов в C, это было бы чрезвычайно полезно.На данный момент большинство информации, которую я нашел, - это официальная документация, которая полезна, но не охватывает все шаблоны, которые я видел при взаимодействии с кодом C.

1 Ответ

0 голосов
/ 26 января 2019

вы можете использовать GC.@preserve для временного сохранения переменных от сбора мусора:

var1
var2

GC.@preserve var1 var2 begin
    ccall(...)
    var3 = unsafe_xxx
end

var3

настоящая причина в том, что вашей общей библиотеке требуется ResultPtr для правильной инициализации, и вы просто выполняли некоторые неопределенные действия:

РЕПЛ

julia> Ref{Ptr{Cstring}}(C_NULL)
Base.RefValue{Ptr{Cstring}}(Ptr{Cstring} @0x0000000000000000)

julia> Ref{Ptr{Cstring}}()
Base.RefValue{Ptr{Cstring}}(Ptr{Cstring} @0x000000011b98ca70)  # this results in segfaults

CMD

➜  opendss-debug git:(master) ✗ julia -e '@show Ref{Ptr{Cstring}}()'
Ref{Ptr{Cstring}}() = Base.RefValue{Ptr{Cstring}}(Ptr{Cstring} @0x0000000000000000)
...