Jump to content

Erro estranho.


jhow

Recommended Posts

Olá!

O programa que você executou tentou acessar um endereço de memória inválido e por isso o SO matou o processo. No caso, ele dá um dump dos opcodes das instruções me 0x42C24B e diz que o errou ocorreu na instrução em 0x42C253. Então dá pra inferir o seguinte:

# rasm2 -ax86 -d e84cabffff8b450c8b008903
call 0xffffab51
mov eax, dword [ebp + 0xc]
mov eax, dword [eax]
mov dword [ebx], eax

Colocando os endereços, ficaria:

42C24B    call 0xffffab51
42C250    mov eax, dword [ebp + 0xc]
42C253    mov eax, dword [eax]
42C255    mov dword [ebx], eax

Então o erro seria na instrução mov eax, dword [eax]. Como no momento que essa instrução roda EAX é 0 (tem um dump dos valores dos registradores na imagem), o programa tenta acessar o endereço de memória 0, o que bate com o erro final (The instruction referenced illegal address 00000000).

A instrução anterior copia um valor para EAX a partir de EBP + C, que parece ser o segundo argumento da função dona dessa instrução. Não dá pra saber se é a main() do programa, mas você pode tentar passar um argumento pra ver se o erro muda:

C:\PROGS\SR632\V3.10\OBJ>NEW.EXE 1 2

Se precisar de mais ajuda, acho que vai ter que copiar a pasta PROGS, compactá-la e enviar aqui pra gente. Assim alguém pode dar uma olhada num disassembler e tentar te ajudar com o erro.

Abraço!

Link to comment
Share on other sites

Eu tentei o comando que me falou e apareceu o erro da foto

Vou ver se consigo um disquete pra copiar a pasta , pq a cpu e muito antigo so tem entrada pra disquete,nao possui usb , e so tem o sistema Ms-Dos , a maquina e uma rebobinadeira.

O que sera que pode ter causado esse erro?

 

E obrigado pelas confirmações. 

20230802_103147.jpg

Link to comment
Share on other sites

Em 02/08/2023 em 10:37, jhow disse:

Vou ver se consigo um disquete pra copiar a pasta , pq a cpu e muito antigo so tem entrada pra disquete,nao possui usb , e so tem o sistema Ms-Dos , a maquina e uma rebobinadeira.

Boa!

Em 02/08/2023 em 10:37, jhow disse:

O que sera que pode ter causado esse erro?

Ainda não sei. Enquanto você não acha os disquetes, consegue tirar uma foto do conteúdo do AUTOEXEC.BAT e CONFIG.SYS? Os comandos são:

cd \
type autoexec.bat
type config.sys

Seria legal também ter a versão do DOS e uma listagem desse diretório OBJ aí:

ver
dir c:\progs\sr632\v3.10\obj

Valeu!

Link to comment
Share on other sites

Opa, deixa eu te pedir mais umas coisas:

  1. Uma foto do conteúdo do AUTOEXEC.BAT que mostre tudo (tá cortando um pedaço na que você mandou).
  2. Uma foto do conteúdo do INIT.BAT. É só comandar type c:\progs\sr632\v3.10\obj\init.bat
  3. Uma foto da saída do comando dir c:\
  4. Uma cópia da pasta inteira (eu sei que você tá buscando os disquetes já, mas só pra não esquecer).

Abraço!

Link to comment
Share on other sites

Eu dei uma olhada aqui e tudo parece bastante interessante. Não tenho o dispositivo com o qual este programa conversa, mas num emulador aqui ele pelo menos subiu:

image_2023-08-04_000159778.png

Aí chega a aparecer esta tela?

Eu tô achando que o problema é o seguinte: a memória RAM está se esgotando e o programa não consegue nem memória para alocar uma string de erro "Out of memory" nessa função:

void sub_42AEC0()
{
  char var_4[4]; // [esp+20h] [ebp-4h] BYREF

  __InitExceptBlock();
  string::string((string *)var_4, aOutOfMemory);
  xalloc::xalloc((xalloc *)&__xalloc, (const string *)var_4, 0);
  string::~string((TStringRef **)var_4, 2);
}

No caso acima, var_4 é null se o operador new falhar. Veja v5 abaixo:

string *__cdecl string::string(string *this, char *s)
{
  size_t v2; // eax
  TStringRef *v3; // eax
  TStringRef *v5; // [esp+28h] [ebp-4h]

  __InitExceptBlock();
  v5 = (TStringRef *)operator new(0x12u);
  if ( v5 )
  {
    if ( s )
      v2 = strlen(s);
    else
      v2 = 0;
    TStringRef::TStringRef(v5, s, v2, 0, 0, 0);
    --*(_DWORD *)_DestructorCountPtr;
    v3 = v5;
  }
  else
  {
    v3 = 0;
  }
  *(_DWORD *)this = v3;
  ++*(_DWORD *)_DestructorCountPtr;
  return this;
}

Com var_4 sendo NULL, o fluxo entra em xalloc(NULL, 0) e dentro dela tem mais duas chamadas, onde uma chega no mov eax, [eax] problemático em 0x0042C253.

Combinando então o seguinte:

  1. Você não alterou nada no sistema.
  2. O sistema rodou no meu emulador.
  3. Minha suspeita de ser um erro de alocação de memória.

Meu palpite é que um pente de memória deste computador tenha queimado ou esteja com algum mau contato e ele está com metade da memória que ele deveria ter. Não sei. Você pode tentar ver quanto de memória tem livre com o comando mem /c e dizer aqui pra gente (postar uma foto da saída). Ou tentar desligar, limpar os pentes de memória e ligar novamente o PC.

Só ideias por enquanto...

Link to comment
Share on other sites

Em 04/08/2023 em 07:43, jhow disse:

Nao chegou nessa parte nao , ela da erro aonde eu mostrei...

Então é mais um indício de que o software está ok e o problema é com a máquina mesmo. É cedo para afirmar, mas é um indício. 🙂

Em 04/08/2023 em 07:43, jhow disse:

Sao 2 ram de 4MB, eu fiz o comando mem /c e deu invalid keyword.

Já experimentou remover os dois pentes de memória e limpar seus contatos com borracha? Ao ligar o PC, é legal ver no POST (aqueles testes que rolam quando o computador liga) se a memória está sendo reconhecida em sua totalidade (8MB no seu caso).

Em 04/08/2023 em 07:43, jhow disse:

Tentei rodar no celular e deu erro da FOTO 

É um emulador de MS-DOS pra celular?

Abraço!

Link to comment
Share on other sites

Olá,

Pegando à partir daqui, eu ainda tenho algumas perguntas sobre o cenário do problema.

1) Você pode compartilhar uma foto do computador em questão, no caso seria interessante uma ou mais fotos fotos, que exiba a Placa-Mãe com alguns detalhes do fabricante, modelo, CPU, Ram e o HD. (que tipo é? HD ou DOM? Barramento do HD é RLL, IDE ou SATA?

2) A placa que você exibiu no inicio eu pensei que fosse uma placa única de PC Industrial, mas olhando com mais atenção eu não identifiquei isso como placa-mãe de PC de Industrial, tudo leva a crer que essa placa é algum tipo de placa de controle de I/O de máquina, se vc conseguir fazer mais fotos com melhor qualidade talvez seja possível localizar material adicional para ajudar em seu problema. Você confirma que essa placa da foto é uma placa que estava instalada dentro de um PC, uma placa de I/O (entrada e saída) ???  O slot dela dentro do PC é ISA 8 Bits??? Ou PCI?

3) Esse problema aconteceu de repente, ou seja, a máquina estava funcionando normal e foi desligada e ao religar o defeito surgiu? Houve algum sinistro de queda de força, tempestade com raios, ou alguma barbeiragem na produção onde alguém inadvertidamente fez algo errado ou um incidente?

4) Na fonte do citado PC a chave que liga ele é do tipo seca (HH) como se fosse um interruptor de lâmpada, fonte do tipo AT?  Ou a fonte é mais moderna, quando se liga, o botão é como o dos PCs modernos, tipo campainha? (push button) nesse caso a fonte é ATX. Você consegue medir nos cabos da fonte se o +5v e +12v estão próximos dos valores de tensão nominal?

5) Você sabe dizer, qual a finalidade da bateria da placa? (foto) É para não perder os ajustes da tarefa caso caia a força, ou mantem parâmetros de sistema como data e hora? O questionamento é se desconectar essa bateria, a placa perde o que? Ela zera algum ajuste de Zero+Set-Point?  

😄 Eu sei que são muitos questionamento, mas esses questionamentos, vai ajudar a guiar sugestões para tentar te ajudar solucionar o problema. Qualquer informação adicional vai ajudar.

Minha opinião antecipada.  Se tratando de equipamentos de chão de fábrica, em geral, quanto mais antigo, mais robusto ele é!  Pelo que você relatou, eu imagino que problema pode estar mesmo centrado nessa placa de I/O, o Fernando fez toda analise estática e dinâmica 🤙 do programa em ambiente emulado, "sem o hardware real", e tudo leva a crer que o defeito se apresenta quando o programa detecta essa placa...  A tela exibe um erro numerado, nesse caso, Erro code 0000004. No passado, muitos programas que rodam em DOS, incluíam nos programas .exe gerados (link-editados) dentro dos .obj gerados depois de compilados (Clipper por exemplo) então se existir um manual do programa em questão, talvez exista uma tabela de erros correspondentes a possíveis causas....  Como ainda não tenho detalhes em qual mídia física esse programa roda durante a produção, se é em um HD ou direto de um disquete (disco flexível) Existe ainda a possibilidade, de existir algum defeito físico nesse disco?!?  Nesse caso, o DOS 6.22 tem um utilitário de disco que é indicado para localizar e consertar erros em discos, erros lógicos & físicos nesses discos, seja ele um disquete ou um HD. O utilitário é o Scandisk.exe, você vai encontra-lo na pasta do DOS. 

Aguardando suas infos complementares. 👍

Jorge Mercês de Barros 🖖

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...