Portal SAMP
[Ajuda] Parameter count loop detected. - Versão de Impressão

+- Portal SAMP (https://portalsamp.com)
+-- Fórum: SA-MP (https://portalsamp.com/forumdisplay.php?fid=5)
+--- Fórum: Área de suporte (https://portalsamp.com/forumdisplay.php?fid=6)
+--- Tópico: [Ajuda] Parameter count loop detected. (/showthread.php?tid=4940)



Parameter count loop detected. - therinhodzn - 27/12/2024

So tinha eu no servidor On-line e isso apareceu
[debug]:
Citar:[debug] Parameter count corrections:
[debug]
[debug] The 1st mangled arguments (e.g. `<1073741823 arguments>`) below should read `<2 arguments>`
[debug] Parameter count loop detected.
[debug]
[debug] Run time error 4: "Array index out of bounds"
[debug]  Attempted to read/write array element at index 20200 in array of size 300
[debug] AMX backtrace:
[debug] #0 0002c964 in _@yHOnPlayerDisconnect@04 (playerid=20200, reason=0) at ..\Dependencias\Global\Login.inc:94
[debug] #1 0001bbe8 in public ScriptInit_OnPlayerDisconnect (20200, 0) at C:\Users\gabri\OneDrive\Área de Trabalho\Samp Servers\RJ ACADEMY\pawno\include\YSI-Includes\YSI_Coding\y_hooks\..\y_cgen\y_cgen_impl.inc:157
[debug] #2 0000b758 in public Android_OnPlayerDisconnect (playerid=20200, reason=0) at C:\Users\gabri\OneDrive\Área de Trabalho\Samp Servers\RJ ACADEMY\pawno\include\YSI-Includes\YSI_Coding\y_hooks\..\..\YSI_Core\y_core\../y_utils/y_utils_ip.inc:115
[debug] #3 00009810 in public Iter_OnPlayerDisconnect (playerid=20200) at C:\Users\gabri\OneDrive\Área de Trabalho\Samp Servers\RJ ACADEMY\pawno\include\YSI-Includes\YSI_Coding\y_hooks\..\..\YSI_Core\y_core\..\..\YSI_Players\y_android\y_android_entry.inc:148
Linha:

Código:
hook OnPlayerDisconnect(playerid, reason)
{
if(pCharacter[playerid][pEstado] == STATUS_ONLINE) // {#} Linha 94
PlayerSave(playerid);

return 1;
}



RE: Parameter count loop detected. - xbruno1000x - 28/12/2024

O servidor está tentando acessar o array pCharacter no índice 20200. O problema é que o índice representa o valor de slots do servidor, e o máximo possível é 1000. Recomendo a analise de entradas e saídas de dados para descobrir o motivo disso, com o printf para realizar esse debug.


RE: Parameter count loop detected. - therinhodzn - 28/12/2024

Poderia me informar onde devo colocar esse debug? Isso ocorre sempre com a callback 'onPlayerDisconnect'. Essa callback é chamada mesmo quando ninguém está se desconectando do servidor, e é chamada em tempos aleatórios

Exemplo: 1 hora após o servidor ser iniciado (e eu estou sozinho no servidor no momento)

Servidor iniciado às 01:36:30
Callback chamada sozinha às 02:32:43

Removi a hook 'onPlayerDisconnect' do modulo 'login.inc'. Após a remoção, o índice mudou para 20284 e a hook agora está sendo chamada em outro módulo que também contém 'onPlayerDisconnect'.

Código:
----------------------------------
[01:36:30] Server Starting Spot Successfully!
[01:36:30] ----------------------------------

[01:36:30] Number of vehicle models: 0
[01:37:04] [connection] 127.0.0.1:52342 requests connection cookie.
[01:37:05] [connection] incoming connection: 127.0.0.1:52342 id: 0
[01:37:05] [join] MaCk has joined the server (0:127.0.0.1)
[02:32:43] [debug]
[02:32:43] [debug] Parameter count corrections:
[02:32:43] [debug]
[02:32:43] [debug] The 1st mangled arguments (e.g. `<1073741823 arguments>`) below should read `<2 arguments>`
[02:32:43] [debug] Parameter count loop detected.
[02:32:43] [debug]
[02:32:43] [debug] Run time error 4: "Array index out of bounds"
[02:32:43] [debug]  Attempted to read/write array element at index 20284 in array of size 300
[02:32:43] [debug] AMX backtrace:
[02:32:43] [debug] #0 0002ef14 in _@yHOnPlayerDisconnect@05 (playerid=20284, reason=0) at ..\Dependencias\Global\Acessorios.inc:70
[02:32:43] [debug] #1 0001bc78 in public ScriptInit_OnPlayerDisconnect (20284, 0) at C:\Users\gabri\OneDrive\ rea de Trabalho\Samp Servers\RJ ACADEMY\pawno\include\YSI-Includes\YSI_Coding\y_hooks\..\y_cgen\y_cgen_impl.inc:157
[02:32:43] [debug] #2 0000b7ac in public Android_OnPlayerDisconnect (playerid=20284, reason=0) at C:\Users\gabri\OneDrive\ rea de Trabalho\Samp Servers\RJ ACADEMY\pawno\include\YSI-Includes\YSI_Coding\y_hooks\..\..\YSI_Core\y_core\../y_utils/y_utils_ip.inc:115
[02:32:43] [debug] #3 00009864 in public Iter_OnPlayerDisconnect (playerid=20284) at C:\Users\gabri\OneDrive\ rea de Trabalho\Samp Servers\RJ ACADEMY\pawno\include\YSI-Includes\YSI_Coding\y_hooks\..\..\YSI_Core\y_core\..\..\YSI_Players\y_android\y_android_entry.inc:148



RE: Parameter count loop detected. - xbruno1000x - 28/12/2024

O ideal seria encontrar de onde esses valores tão altos estão surgindo e resolver a raiz do problema, mas é possível fazer uma solução temporária também para evitar crash's/debug's.

Adicione uma validação no modulo principal para que esses valores não passem adiante, conforme o exemplo abaixo:
Código:
public OnPlayerDisconnect(playerid, reason)
{
    //O código abaixo deve estar no topo da public, para garantir que nada seja processado antes dele.
    if (playerid < 0 || playerid >= GetMaxPlayers())
    {
        printf("[ERRO] playerid fora dos limites na OnPlayerDisconnect: %d", playerid);
        return 0;
    }
    return 1;
}

Dessa forma nenhum código irá tentar acessar uma posição inválida do array. Poderia até mesmo remover o printf para manter o log limpo.

Por outro lado, para corrigir o problema de maneira permanente, teria que revisar os códigos de hook. O runtime error do YSI "Parameter count loop detected." indica que existe hook ou callback mal configurada ou mal chamada.

Certifique-se de a assinatura da função estar consistente, ou seja, deve ser da forma abaixo:

Código:
//DEVE SER ASSIM:
hook OnPlayerDisconnect(playerid, reason)
{
    return 1;
}
//NÃO DEVE SER ASSIM:
hook OnPlayerDisconnect(playerid)
{
    return 1;
}

Também podem haver recursões gerando o problema, como o exemplo abaixo:
Código:
hook OnPlayerDisconnect(playerid, reason)
{
    OnPlayerDisconnect(playerid, reason);
    return 1;
}

Busque por esses problemas nas hook OnPlayerDisconnect para tentar resolver o problema pela raiz. Com a verificação você já deve evitar que esse problema gere quaisquer males ao servidor.