Тема будет оченя вялотекущая, тем не менее иногда сталкиваюсь с неожиданным поведением среды. Подобные заметки могут быть кому-то полезны, например, мне, склероз не дремлет.
Код
local kernel32 = ffi.load("kernel32")
local threadId = ffi.new("DWORD[1]")
local threadHandle = kernel32.CreateThread(nil, 0, ffi.cast("THREAD_START_ROUTINE", async), ffi.cast("LPVOID", HintStruct), 0, threadId)
Вызов kernel32.CreateThread и C.CreateThread на самом деле не эквивалентен. В частности в этом случае вызов через C.CreateThread шансово приводит к крашу. Причины я не знаю, но факт на лицо. В качесте домыслов через C.CreateThread подтягивается функция принадлежащая самому lua, а не конкретной либе.
Zerobane отладка.
Код
while 1 do
local a = false
if a then
print("a == true")
end
end
Очевидно, что цикл будет крутиться вечно, а условие if a then никогда не выполнится. Ставим brake, меняем через отладчик значение a = true. Условие if a then все равно не будет выполнятся. При том, что а действительно будет равна true. Дело в том, что jit создал bypass, т.к. посчитал, что a константа и никогда не будет изменена. Фактически он никогда и не проверял ее значение, а просто делал безусловный переход пропуская блок if end. В качестве решения можно использовать конструкцию:
Код
local f = function(new_var) end
do
local var = false
f = function(new_var)
if new_var then
var = new_var
end
return var
end
end
while 1 do
local a = f(false)
if a then
print("a == true")
end
end
Данная заглушка позволит выполнить отладку с минимальными вмешательствами в код.
Сообщение отредактировал DarkMaster - 8.6.2024, 9:29