Erro estranho no system.pas
Caros amigos, tenho um sistema que apresenta um erro em algumas máquinas, mas em outras ele executa sem problemas. A mensagem de erro é a seguinte: ´Runtime error 216 at 00404326´, e sempre aparece na inicialização do sistema. Debuguei o sistema e pedi para localizar este erro e a CPU me mostrou que ele ocorre na seguinte linha:
00404326 8BC0 mov eax,eax
Não sei o que está acontecendo, por isso peço ajuda de vcs para solucionar este problema, pois este sistema executa em algumas máquinas com XP, em outras oras executa e oras não; e em outras nem executa.
Desde já agradeço.
00404326 8BC0 mov eax,eax
Não sei o que está acontecendo, por isso peço ajuda de vcs para solucionar este problema, pois este sistema executa em algumas máquinas com XP, em outras oras executa e oras não; e em outras nem executa.
Desde já agradeço.
Alex Maia
Curtidas 0
Respostas
Alex Maia
29/05/2006
Esqueci de falar que este erro parece ser na unit system.pas, pois lá esta assim em assembler:
system.pas. 8372:
00404325 C3 ret
00404326 8BC0 mov eax,eax
system.pas. 8372:
00404325 C3 ret
00404326 8BC0 mov eax,eax
GOSTEI 0
Alex Maia
29/05/2006
Caros amigos,
Fiz um levantamento aqui na empresa e descobri que as máquinas em que ocorreram os problemas são pentium. A maioria das máquinas aqui são AMD, a máquina onde compilo o sistema tambem é AMD e nelas não houve erro algum. Pergunto:
Será que o erro pode ser este mesmo?? Alguem já teve algum problema de incompatibilidade assim??
Desde já agradeço
Fiz um levantamento aqui na empresa e descobri que as máquinas em que ocorreram os problemas são pentium. A maioria das máquinas aqui são AMD, a máquina onde compilo o sistema tambem é AMD e nelas não houve erro algum. Pergunto:
Será que o erro pode ser este mesmo?? Alguem já teve algum problema de incompatibilidade assim??
Desde já agradeço
GOSTEI 0
Amarildo
29/05/2006
Ola Alex Maia, este erro é ocasionado pelo motivo da área do spool estar sobrecarregada em muita das vezes. O outro fator que tenho tido com relacao a esse erro, foi tambem em xp, caso voce esteja abrindo tabelas ou query com banco de dados paradox ou dbf, essa ocorrencia de erros podera ter uma frequencia maior. Já tentamos formatar a maquina para tentar achar a solução e nada de resolver. Acabamos por acreditar que a única solução foi de verificar a placa mãe, e constatamos que onde o micro ficava, ocorria muita turbulência, pois havia do outro lado do salão, injetoras de grande porte, que vinha prejudicando o micro, foi apenas trocar a placa mãe que ja estava ficando danificada e não suportava mais os solavancos do dia-a-dia das injetoras, feito isso o problema foi solucionado. Isso tudo foi que tenho passado com relacao a esse erro, espero por ter ajudado. Obs. Envia para algum tecnico verificar a placa mãe dos micros, derrepente ele poderá verificar ou constatar alguma perda de performace neste sentido. Felicidades e sucesso espero que tudo se resolva da melhor maneira possível, ate+
GOSTEI 0
Alex Maia
29/05/2006
Alguem tem outra explicação pra isso??
GOSTEI 0
Massuda
29/05/2006
Imagino que você já olhou a inicialização do seu sistema.
Uma fonte de erros na inicialização costuma ser ter componentes de acesso a banco de dados ativos quando você compila o programa; o ideal é você ter esses componentes desativados e, depois de configurá-los na inicialização do programa, ativar essas conexões.
Você não mencionou qual sua versão do Delphi, mas olhando no meu System.pas aparentemente o problema está ocorrendo ao manipular strings OLE; geralmente isso está relacionado com objetos COM. Você usa algum objeto COM no seu programa, por exemplo, WordApplication?
Uma fonte de erros na inicialização costuma ser ter componentes de acesso a banco de dados ativos quando você compila o programa; o ideal é você ter esses componentes desativados e, depois de configurá-los na inicialização do programa, ativar essas conexões.
Você não mencionou qual sua versão do Delphi, mas olhando no meu System.pas aparentemente o problema está ocorrendo ao manipular strings OLE; geralmente isso está relacionado com objetos COM. Você usa algum objeto COM no seu programa, por exemplo, WordApplication?
GOSTEI 0
Alex Maia
29/05/2006
Caro amigo Massuda,
Já olhei a inicialização do sistema. Eu uso o Delphi 7 e na inicialização o meu DataModule é criado, porém nenhuma conexão com o banco de dados é estabelacida. Fora isso, somente a busca de valores armazenados em um arquivo INI é realizada. A conexão com o banco eu realizo através de tela de login depois que o usuário pede para validar usuário e senha. Sendo assim eu descarto a possibilidade de ter componentes de acesso a banco de dados ativos quando você compila o programa. Só pra esclarecer o que eu disse, o sistema é compilado normalmente na minha máquina que é um semprom, roda perfeitamente nas outras máquinas AMD aqui na empresa, contudo ora não executa e ora executa em máquinas com processadores P4.
Já olhei a inicialização do sistema. Eu uso o Delphi 7 e na inicialização o meu DataModule é criado, porém nenhuma conexão com o banco de dados é estabelacida. Fora isso, somente a busca de valores armazenados em um arquivo INI é realizada. A conexão com o banco eu realizo através de tela de login depois que o usuário pede para validar usuário e senha. Sendo assim eu descarto a possibilidade de ter componentes de acesso a banco de dados ativos quando você compila o programa. Só pra esclarecer o que eu disse, o sistema é compilado normalmente na minha máquina que é um semprom, roda perfeitamente nas outras máquinas AMD aqui na empresa, contudo ora não executa e ora executa em máquinas com processadores P4.
GOSTEI 0
Massuda
29/05/2006
Olhando no system.pas do D7, dá para ver que a linha 8372 é da procedure TObject.FreeInstance, que é executada quando um objeto é destruído. A única forma de dar problema aí é seu código tentar destruir um objeto que ou não foi criado (nil) ou já foi destruído anteriormente.
Isso pode indicar algum problema em algum ponto da inicialização. Talvez não seja o caso, mas um detalhe importante, mas geralmente ignorado, é que em caso de exceção durante a criação de um objeto, o destrutor desse objeto é automaticamente chamado; por esse motivo, é bom testar no destrutor se os objetos a serem destruídos são válidos (ou use .Free) e nunca usar .Destroy.
Fora isso, não me ocorre mais nada que possa causar esse problema.
Isso pode indicar algum problema em algum ponto da inicialização. Talvez não seja o caso, mas um detalhe importante, mas geralmente ignorado, é que em caso de exceção durante a criação de um objeto, o destrutor desse objeto é automaticamente chamado; por esse motivo, é bom testar no destrutor se os objetos a serem destruídos são válidos (ou use .Free) e nunca usar .Destroy.
Fora isso, não me ocorre mais nada que possa causar esse problema.
GOSTEI 0
Alex Maia
29/05/2006
Caro amigo Massuda,
Segue abaixo o código de inicialização do meu sistema. Por favor, veja se há algo de errado.
.
.
.
var
SystemDir: array [0..144] of char;
Ini: TIniFile;
begin
try
Application.Initialize;
Application.Title := ´Nome Sistema´;
Application.CreateForm(TDM, DM);
//Pega o caminho do diretorio system do windows
GetSystemDirectory(SystemDir, 144);
Ini := TIniFile.Create(String(SystemDir + ´\TVNews.Ini´));
if Ini.ReadString(´Dados´,´Registry´,´´) <> ´T´ then begin
try
If F_Registro = Nil Then
Application.CreateForm(TF_Registro,F_Registro);
F_Registro.ShowModal;
FreeAndNil(F_Registro);
except
Application.MessageBox(´Erro ao criar tela de registro do sistema!´,
´Atenção´, MB_ICONEXCLAMATION + MB_OK);
end;
end;
p_AppPath := ExtractFilePath(Application.ExeName);
p_HostName := Ini.ReadString(´Dados´,´Host_Name´,´´);
p_DbPrincipal := Ini.ReadString(´Dados´,´DbPrincipal´,´´);
p_Password := Ini.ReadString(´Dados´,´Password´,´´);
p_UserName := Ini.ReadString(´Dados´,´User_Name´,´´);
Ini.Free;
Application.CreateForm(TF_Principal, F_Principal);
//Verifica se o sistema já esta aberto
SistemaAberto;
Application.CreateForm(TF_Login, F_Login);
F_Login.ShowModal;
FreeAndNil(F_Login);
Application.Run;
Except
Application.MessageBox(´Erro ao inicializar o sistema. Por favor, contate o suporte técnico!´,
´Atenção´, MB_ICONEXCLAMATION + MB_OK);
end;
end.
Segue abaixo o código de inicialização do meu sistema. Por favor, veja se há algo de errado.
.
.
.
var
SystemDir: array [0..144] of char;
Ini: TIniFile;
begin
try
Application.Initialize;
Application.Title := ´Nome Sistema´;
Application.CreateForm(TDM, DM);
//Pega o caminho do diretorio system do windows
GetSystemDirectory(SystemDir, 144);
Ini := TIniFile.Create(String(SystemDir + ´\TVNews.Ini´));
if Ini.ReadString(´Dados´,´Registry´,´´) <> ´T´ then begin
try
If F_Registro = Nil Then
Application.CreateForm(TF_Registro,F_Registro);
F_Registro.ShowModal;
FreeAndNil(F_Registro);
except
Application.MessageBox(´Erro ao criar tela de registro do sistema!´,
´Atenção´, MB_ICONEXCLAMATION + MB_OK);
end;
end;
p_AppPath := ExtractFilePath(Application.ExeName);
p_HostName := Ini.ReadString(´Dados´,´Host_Name´,´´);
p_DbPrincipal := Ini.ReadString(´Dados´,´DbPrincipal´,´´);
p_Password := Ini.ReadString(´Dados´,´Password´,´´);
p_UserName := Ini.ReadString(´Dados´,´User_Name´,´´);
Ini.Free;
Application.CreateForm(TF_Principal, F_Principal);
//Verifica se o sistema já esta aberto
SistemaAberto;
Application.CreateForm(TF_Login, F_Login);
F_Login.ShowModal;
FreeAndNil(F_Login);
Application.Run;
Except
Application.MessageBox(´Erro ao inicializar o sistema. Por favor, contate o suporte técnico!´,
´Atenção´, MB_ICONEXCLAMATION + MB_OK);
end;
end.
GOSTEI 0
Massuda
29/05/2006
Esse tipo de problema é chato de resolver. Aparentemente não tem nada de errado no código que você postou, mas o que eu chamo de ´inicialização´ incluiria todos os OnCreate/OnShow/OnActivate (e tem também a finalziação que incluiu os OnDestroy/OnDeactivate/OnClose) dos forms criados no DPR; além disso, pode ser que componentes de terceiros que você por acaso utilize tenham algum tipo de inicialização/finalização que pode eventualmente ter bugs.
Você já executou passo-a-passo (na máquina que dá problema) para ver a sequencia de execução do seu programa?
Você já executou passo-a-passo (na máquina que dá problema) para ver a sequencia de execução do seu programa?
GOSTEI 0
Alex Maia
29/05/2006
Como vc viu somente o meu form principal e o meu DataModule são criados na inicialização, e os demais são criados dinamicamente. Tenho o componente VclSkin no meu form principal, porém não creio que seja ele que esteja causando isso. O que me deixa curioso é o fato do programa apresentar este problema de vez em quando em máquinas Intel, ainda mais que ele nunca apresentou erro algum durante as compilações e execuções realizadas na máquina que trabalho.
GOSTEI 0
Massuda
29/05/2006
[quote:404950bd77=´Alex Maia´]Tenho o componente VclSkin no meu form principal...[/quote:404950bd77]A não ser que você esteja usando sempre a última versão desse componente, sugiro que teste sem ele... é um dos componentes mais cheio de problemas que existe.
[quote:404950bd77=´Alex Maia´]...ainda mais que ele nunca apresentou erro algum durante as compilações e execuções realizadas na máquina que trabalho.[/quote:404950bd77]Teste na máquina que dá o problema... não tem como corrigir um problema que você não consegue reproduzir.
Fora isso, não tenho mais sugestões.
[quote:404950bd77=´Alex Maia´]...ainda mais que ele nunca apresentou erro algum durante as compilações e execuções realizadas na máquina que trabalho.[/quote:404950bd77]Teste na máquina que dá o problema... não tem como corrigir um problema que você não consegue reproduzir.
Fora isso, não tenho mais sugestões.
GOSTEI 0