String.gmatch can become stuck in use after an error.
Take this example debug script:
local it = string.gmatch("hello world", "(%a)%2")
local ok1, err1 = pcall(it)
print("call 1:", ok1, err1)
local ok2, err2 = pcall(it)
print("call 2:", ok2, err2)
It outputs:
call 1: false invalid capture index %2
call 2: false gmatch iterator is already in use
While I would expect:
call 1: false invalid capture index %2
call 2: false invalid capture index %2