Como ler um FiveM SCRIPT ERROR: arquivo, linha e stack trace
Aprenda a ler um FiveM SCRIPT ERROR: o caminho do recurso e arquivo, o número de linha, o stack trace, F8 versus o console do server, e como adicionar prints para encontrar a causa.
Um erro típico no console:
SCRIPT ERROR: @my_script/server/main.lua:42: attempt to index a nil value (local 'xPlayer')
> handler (@my_script/server/main.lua:42)
> ref (citizen:/scripting/lua/scheduler.lua:...)Parece ruído, mas cada parte tem um significado, e geralmente te diz exatamente onde olhar. Este guia mostra como lê-lo, onde encontrá-lo, e o que fazer quando não é suficiente.
A primeira linha: o quê, onde e por quê
SCRIPT ERROR: @my_script/server/main.lua:42: attempt to index a nil value (local 'xPlayer')SCRIPT ERROR:marca um erro Lua em um script. O script continua rodando após, mas o código que falhou parou naquela linha.@my_script/server/main.luaé o nome do recurso (my_script) e o caminho do arquivo dentro da pasta de recurso.:42é o número da linha naquele arquivo.- O resto é a mensagem:
attempt to index a nil value (local 'xPlayer'). Lua lê assim: na linha 42 você tentou usar algo dentro dexPlayer, masxPlayerénil.
Abra o arquivo, vá para aquela linha, e olhe as variáveis que aquela linha usa. Na maioria dos casos a resposta já está lá. Mensagens comuns têm seus próprios guias: attempt to call a nil value e attempt to compare nil.
O stack trace: como o código chegou lá
As linhas começando com > são o stack trace. Lista as funções que estavam rodando, da que falhou para baixo até a que iniciou:
> handler (@my_script/server/main.lua:42)
> ref (citizen:/scripting/lua/scheduler.lua:...)A primeira linha após o erro é o mesmo lugar que o erro. Linhas abaixo mostram quem chamou aquela função. Quando o erro está dentro de uma biblioteca ou outro recurso, uma linha do seu próprio script mais abaixo na lista é frequentemente a causa real, porque seu script passou um valor errado para ela.
Linhas que começam com citizen:/scripting/lua/... (por exemplo citizen:/scripting/lua/scheduler.lua) pertencem ao próprio FiveM. São parte da maquinaria que roda seus eventos e threads. Você pode ignorá-las: o erro nunca é consertado lá, e apenas mostram que uma thread ou evento estava rodando.
Cliente ou server: onde olhar
Um erro de script aparece no lado onde o código roda:
- Client scripts (
client_scripts, arquivos em uma pastaclient): pressione F8 no jogo para abrir o console do cliente. Se você não vê nada, role para cima, pois erros podem rolar rápido. - Server scripts (
server_scripts, arquivos em uma pastaserver): leia o console do server. Em txAdmin, é a página Live Console. Em um server iniciado de um terminal, é aquela janela de terminal. - Shared scripts rodam em ambos os lados, então o erro pode aparecer em qualquer lugar.
Dica: se um menu ou uma ação não faz nada e F8 está vazio, verifique o console do server. O código que falha pode estar no lado do server.
Qual linha olhar
- Leia a mensagem primeiro: diz qual tipo de problema é (
nil, um tipo errado, um export faltando). - Abra o arquivo e linha da primeira linha. Verifique cada variável nele.
- Se o arquivo pertence a uma biblioteca (ox_lib, o framework), desça o stack trace até alcançar uma linha do script que você está consertando.
- Verifique se o erro aparece uma vez ou constantemente. Um erro constante em um loop inunda o console. Conserte aquele primeiro, pois esconde outras mensagens.
Erros com o texto No such export ou could not find dependency são diferentes. São sobre recursos, não linhas de código. Veja could not find dependency.
Quando a linha não é suficiente: adicione prints
Se a linha usa várias variáveis e você não sabe qual é nil, imprima-as logo antes:
print('xPlayer:', xPlayer)
print('source:', source, type(source))
print('data:', json.encode(data))Rode o código novamente e leia o console. Algumas dicas para prints úteis:
- Imprima o tipo bem como o valor:
type(value)mostranil,number,string,tableoufunction. - Use
json.encode(table)para ver dentro de uma tabela. Um simplesprint(table)apenas mostra um endereço de memória. - Coloque um rótulo curto na frente, então você pode encontrar a linha em um console ocupado.
- Imprima no início de uma função, para confirmar que roda absolutamente.
Remova os prints uma vez o problema seja consertado, pois custam performance em loops ocupados.
Onde um erro não aparece
- Escrowed scripts escondem seu código. O erro te dá um nome de arquivo, mas o arquivo é encriptado e você não pode ler a linha. Contate o autor com o texto de erro completo.
- NUI errors (o menu em si, escrito em HTML e JavaScript) não aparecem em F8 como
SCRIPT ERROR. Abra as ferramentas de desenvolvedor NUI para lê-las: o comandonui_devtoolsno console F8 os abre em uma aba do navegador. - Erros nos primeiros segundos: quando você inicia o server, erros de recursos que falham ao carregar podem passar rápido. Procure no console ou role para cima, ou reinicie apenas aquele recurso e observe.
O que enviar quando você pedir ajuda
Copie o erro completo, o stack trace incluído, como texto, e diga se vem de F8 ou do console do server. Adicione a linha de código que aponta e o framework que você usa. Uma screenshot de uma linha recortada não é suficiente para ninguém ajudá-lo.
Checklist
| Sintoma | Solução |
|---|---|
@resource/path.lua:42 |
Abra aquele arquivo naquele recurso e vá para linha 42 |
| Erro em um arquivo de biblioteca | Siga o stack trace para a primeira linha do seu próprio script |
Linhas citizen:/scripting/lua/... |
Internals do FiveM: ignore-as |
| Nada em F8 mas o feature falha | Leia o console do server |
| Várias variáveis na linha que falha | Imprima cada uma com type() e json.encode() |
| Arquivo de erro é ilegível | Script escrowed: envie o texto de erro completo ao autor |
| Menu NUI falha | Abra nui_devtools e leia o console do navegador |
Respostas rápidas
Onde eu vejo um erro de client script?
Pressione F8 no jogo para abrir o console do cliente. Erros de client scripts aparecem lá em vermelho, com o nome do recurso e a linha.
Onde eu vejo um erro de server script?
No console do server, que é a Live Console em txAdmin ou a janela de terminal onde o server roda. Erros de server não aparecem em F8.
O erro aponta para um arquivo em outro recurso. Aquele script está quebrado?
Nem sempre. Olhe mais abaixo o stack trace: a linha que chama para aquele recurso, com argumentos errados ou faltando, é frequentemente a causa real.
Scripts sem esse problema
Mic PhoneUm celular dobrável que abre em tablet e chega ao celular de verdade do jogador.Ver script →
CCTV Security CamerasCâmeras posicionáveis, um tablet com várias telas ao vivo e fotos impressas como prova.Ver script →
Advanced BoostingBoosting de veículos pelo tablet: contratos da classe D à S+, crews e fila ao vivo.Ver script →