[TUT][SIMPLES] Detectar que parte do cуdigo estб dando Crash usando Debug
#1

Introduзгo:


Fala galera, tudo tranquilo ?

Recentemente tenho visto muitos tуpicos aqui na Board sobre Publics ou Funзхes dando Crash e o usuбrio nгo conseguir identificar o erro, isso acontecia seguidamente comigo, аs vezes erros toscos, аs vezes nгo, enfim, atй que aprendi esta forma muito simples de identificar de onde estб vindo o erro, chama-se Debug, espero que ela possa ser ъtil para alguйm.

O que й "Debug"

De acordo com a Wikipedia, "Debug" й:

"Depuraзгo (em inglкs: debugging, debug) й o processo de encontrar e reduzir defeitos num aplicativo de software ou mesmo em hardware. Erros de software incluem aqueles que previnem o programa de ser executado e aqueles que produzem um resultado inesperado."

Em outras palavras, "Debug" й o processo onde vocк encontra erros em um Aplicativo, estes erros fazem com o que o programa nгo seja executado, seja fechado (Crash) ou produzem um resultado inesperado.

Debug em Publics

Vamos supor que a Public a seguir estб dando Crash (sу um exemplo ilustrativo, ela nгo estб):

pawn Код:
public OnPlayerText(playerid, text[])
{
    if(PlayerInfo[playerid][pCalado] == 1)
    {
        SendClientMessage(playerid,Vermelho,"ERRO: Vocк estб mudo e nгo pode falar no chat");
        return 0;
    }
    format(Str, 256, "%s %s", GetPlayerNameEx(playerid), text);
    Log("Logs/FalaTodos.ini", Str);
    return 1;
}
Vocк nгo sabe onde estб o erro, segue o que vocк irб fazer:

Adicione um "print" em cada linha, exemplo:

pawn Код:
public OnPlayerText(playerid, text[])
{
    print("1");
    if(PlayerInfo[playerid][pCalado] == 1)
    {
        SendClientMessage(playerid,Vermelho,"ERRO: Vocк estб mudo e nгo pode falar no chat");
        return 0;
    }
    print("2");
    format(Str, 256, "%s %s", GetPlayerNameEx(playerid), text);
    print("3");
    Log("Logs/FalaTodos.ini", Str);
    print("4");
    return 1;
}
Como descobrir em que ponto a Public Crashou:

Como podem ver eu inseri um total de 4 Prints numerados em ordem crescente, comeзando a partir do um. Quando a public for chamada (nesse caso, quando o player digitar) irб printar "1" no console, apуs fazer a verificaзгo para saber se ele estб mudo, printarб "2", apуs formatar a mesma printarб "3" e apуs escrever o Log, printarб "4".

Caso as prints nгo cheguem nem mesmo a 2, significa que o Crash ocorreu dentro da "if", e segue o que iremos fazer:

pawn Код:
if(PlayerInfo[playerid][pCalado] == 1)
    {
        print("1.1");
        SendClientMessage(playerid,Vermelho,"ERRO: Vocк estб mudo e nгo pode falar no chat");
        print("1.2");
        return 0;
    }
Faremos o mesmo esquema que fizemos em toda a public dentro da if, quando o "if" for aberto, printarб "1.1", e quando enviar a mensagem para o player, printarб "2.2".

Caso nгo chegue a printar o "1.2" significa que o Crash ocorreu na funзгo "SendClientMessage", ou seja, que ela nгo estб sendo usada corretamente.

Agora, voltando para fora do "if":

pawn Код:
public OnPlayerText(playerid, text[])
{
    print("1");
    if(PlayerInfo[playerid][pCalado] == 1)
    {
        SendClientMessage(playerid,Vermelho,"ERRO: Vocк estб mudo e nгo pode falar no chat");
        return 0;
    }
    print("2");
    format(Str, 256, "%s %s", GetPlayerNameEx(playerid), text);
    print("3");
    Log("Logs/FalaTodos.ini", Str);
    print("4");
    return 1;
}
Caso chegue a printar "2", mas nгo printe "3", significa que o Crash ocorreu na formataзгo, ou seja, na linha:

pawn Код:
format(Str, 256, "%s %s", GetPlayerNameEx(playerid), text);
Caso o mesmo printe "3", mas nгo printe "4", significa que o Crash ocorreu na funзгo "Log", o que nos leva a prуxima parte do tutorial:

Debug em Funзхes

Como vimos na parte anterior, a funзгo que estava Crashando era a "Log", que podemos ver abaixo:

pawn Код:
stock Log(const File[], string[])
{
    if(!fexist(File))
    {
        CriarLog(File);
    }
    new celulas[ 300 ];
    new a, m, d, h, mi, s;
    getdate(a, m, d);
    gettime(h,mi,s);
    format(celulas, sizeof(celulas), "(%02d/%02d/%d)[%02d:%02d:%02d] %s\r\n",d,m,a,h,mi,s, string);
    new File:Arquivo1 = fopen(File, io_append);
    fwrite(Arquivo1, celulas);
    fclose(Arquivo1);
    return 1;
}
Para saber em que ponto a Stock (ou funзгo, como quiserem) crashou, faremos exatamente o que fizemos na Public:

pawn Код:
stock Log(const File[], string[])
{
    print("1");
    if(!fexist(File))
    {
        CriarLog(File);
    }
    print("2");
    new celulas[ 300 ];
    print("3");
    new a, m, d, h, mi, s;
    print("4");
    getdate(a, m, d);
    print("5");
    gettime(h,mi,s);
    print("6");
    format(celulas, sizeof(celulas), "(%02d/%02d/%d)[%02d:%02d:%02d] %s\r\n",d,m,a,h,mi,s, string);
    print("7");
    new File:Arquivo1 = fopen(File, io_append);
    print("8");
    fwrite(Arquivo1, celulas);
    print("9");
    fclose(Arquivo1);
    print("10");
    return 1;
}
Como podem ver, fizemos a mesma coisa, criamos prints de nъmeros em forma crescente a partir do 1, assim, quando a funзгo for executada, printarб os nъmeros em ordem no console, e assim podemos ver atй que nъmero foi printado, em outras palavras, atй que linha o cуdigo foi executado antes de Crashar.

Caso nгo chegue nem mesmo a printar o "2", sabemos que o erro estб dentro da "if", e faremos o debug dentro da mesma:

pawn Код:
if(!fexist(File))
    {
        print("1.1");
        CriarLog(File);
        print("1.2");
    }
Caso nгo chegue a printar a "1.2" significa que o Crash estб na funзгo "CriarLog" e repetiremos o processo na mesma.

Caso termine de verificar o "if" e o mesmo printe o "2", mas nгo printe o "3", sabemos que o Crash estб ocorrendo na linha:

pawn Код:
new celulas[ 300 ];
E assim por diante.

Crashs Comuns:

Й bastante comum os Crashs acontecerem quando fazemos operaзхes "impossнveis", por exemplo:

pawn Код:
new Zero = 0;
new Um = 1;
new Total = Um / Zero; //LINHA
Com quase absoluta certeza, a linha destacada irб crashar, por que, como vocкs devem saber, й impossнvel dividir um nъmero por zero.

-

Enfim, й um tutorial muito simples e pode parecer trabalhoso, mas ele com 100% DE CERTEZA irб indicar o Local do Crash se usado de forma correta.

-

Crйditos:

- Graf_Spee (Eu) *-*

Reply
#2

Boa, mas tambйm tem o crashdetect.
Reply
#3

Pф, esse plugin teria salvado minha vida .-. Enfim, agora jб postei, ta aн pra quem precisar...
Reply
#4

Quote:
Originally Posted by [THs]ShadoW
Посмотреть сообщение
Pф, esse plugin teria salvado minha vida .-. Enfim, agora jб postei, ta aн pra quem precisar...
Essa forma й boa tambйm, bom tutorial
Reply
#5

Obrigado
Reply
#6

Quote:
Originally Posted by JesterAnkes
Посмотреть сообщение
Boa, mas tambйm tem o crashdetect.
Prefiro dessa forma
Reply
#7

eh o crash detect facilita muito a vida
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)