25.08.2013, 23:45
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б):
Vocк nгo sabe onde estб o erro, segue o que vocк irб fazer:
Adicione um "print" em cada linha, exemplo:
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:
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":
Caso chegue a printar "2", mas nгo printe "3", significa que o Crash ocorreu na formataзгo, ou seja, na linha:
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:
Para saber em que ponto a Stock (ou funзгo, como quiserem) crashou, faremos exatamente o que fizemos na Public:
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:
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:
E assim por diante.
Crashs Comuns:
Й bastante comum os Crashs acontecerem quando fazemos operaзхes "impossнveis", por exemplo:
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) *-*
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;
}
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 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;
}
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;
}
pawn Код:
format(Str, 256, "%s %s", GetPlayerNameEx(playerid), text);
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;
}
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;
}
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 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 ];
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
-
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) *-*