PDA

Ver la Versión Completa : Excepcion jamas antes vista


nefy
02-03-2004, 20:20:59
Hola este problema no encuentro su razon de ser lo q pasa es q al momento de ejecutar mi sistema desde Delphi una vez dentro de la forma principal al momento de unicamente presionar el "-" (menos) del bloque numerico se crea una excepcion pero no un msg sino q aparece una pantalla con 5 frames
y con instrucciones parece ser q en ensamblador. El encabezado de la pantalla dice CPU y la barra de titulo de Delphi dice "stopped".

Esto sucede en cualquiera de las otras pantallas del sistema no solo en la principal. Ademas esto ocurre solo cuando lo ejecuto a partir del diseño.
Pero si ejecuto el sistema no desde delphi sino fuera de el hago correr el .exe
y presiono el menos no bloquea ni nada.

Pero quiero quitar ese bug y entender porq sucede. Esto temiendo llegue a afectar la aplicacion mas adelante.
Espero haberme explicado y gracias por su ayuda.

Saludos

islu
08-03-2004, 11:15:50
Esto me pasa a mi, y no se lo que es, me pasa nada más ejecutar la aplicación, sin pulsar ninguna tecla, nada más arrancar. De momento lo he solventado cambiando el icono de la aplicación, por uno de 16 colores, si como lo oyes ( o como lo lees ) cambiando el icono no me pasa. Si consigues saber por que pasa esto, me sería de gran ayuda que me lo comentases.

Un saludo.

marto
08-03-2004, 11:50:15
Lo que te passa es que se está produciendo algun tipo de excepción pero esta se captura desde código, por eso al ejecutar des del IDE la ves, pero des de fuera no. Si no quieres ver este tipo de excepciones, vete Tools, Debugger options, Language Exceptions y "desmarca" la casilla "Stop on Delphi Exceptions" (esto es en Delphi6, pero en D7 no puede variar mucho). La otra opción es, cuando salte la excepción, aceptar el mesaje de error y darle a Run (F9).

islu
08-03-2004, 18:01:14
Marto, creo que no es ese el problema de Nefy, ya que al parecer es la misma pantalla que tengo yo y yo tengo deshabilidado el check al que te refieres.

marto
08-03-2004, 18:17:28
Pues no lo sé... pero la descripción que pone es "clavaita" a lo que sucede cuando salta una excepción....
La pantalla que comenta de CPU muestra las instrucciones en ensamblador que se están ejecutando, y permite depurar al nivel más bajo. Si molesta, se cierra y se depura sobre código.
Si se hace F7 saltará a la próxima linia de código... si es que tengo razón y es una excepción... podríais probarlo y decirnos qué tal...

islu
08-03-2004, 18:30:03
Si en realidad se trata de una excepción, pero no atiende al check de "Stop on Delphi Exceptions"; y como bien dices yo pulso F7 ó F8 y avanza, pero pulso F9 ( para continuar con al ejecución ) y nada, se vuelve a parar, como si pulsase F8.
Lo más curioso ha sido que cambiando el icono a por uno de 16 colores, va bien...

Muchas gracias.

marto
08-03-2004, 18:47:51
Como diría algún político español... esto es wraro, wraro, wraro :D :D :D

¿Por qué no nos pasas el fragmento de código en el que petaba? lo cierto es que a mi me como la curiosidad ;-)

islu
08-03-2004, 18:51:09
Te puedo mandar el proyecto completo. Puedo hacerlo por mail ?

marcoszorrilla
08-03-2004, 19:50:19
Si cambiando la configuración de colores de la tarjeta gráfica te funciona, el arreglo sería simplemente bajar la acelaración del Hardware de la tarjeta gráfica.

Para mas datos botón derecho sobre el escritorio, configuración avanzada, rendimiento. (Espero que ese sea tu problema).

Un Saludo.

marto
08-03-2004, 20:58:23
Sobre lo de mandar el proyecto, si no requiere BD y solo me mandas los ficheros de texto y la imagen comprimidos, me lo miraré el fin de semana. De todas maneras, ten en cuenta que ha de compilar en D5, que es lo que tengo en casa.

Si me lo quieres mandar, tienes la @ en mi perfil

islu
09-03-2004, 09:16:56
Gracias Marto, sino te importa lo que haré es enviarte un proyecto sencillo ( un form con un botón ) ya que la excepción da con tan solo eso.

Gracias de nuevo, espero no abusar de tú amabilidad.

marto
10-03-2004, 20:43:18
Por mi perfecto, pero si el código es tan sencillo, tambien puedes hacer aquí un post con las "lineas malditas" y así lo vemos todos!

islu
15-03-2004, 09:42:37
Disculpa por mi silencio, pero he estado fuera, hoy mismo te lo mando.

Un saludo.

roman
15-03-2004, 15:58:19
Reitero lo que te dice el compañero marto en su último mensaje. Si colocas aquí el proyecto simplificado salimos todos beneficiados.

// Saludos

islu
15-03-2004, 16:04:37
Ok, pero como se trata de un proyecto, y no de un cacho de código no se como ponerlo. Puedo colgar un zip ?

Muchas gracias.

roman
15-03-2004, 16:23:00
No necesariamente, puedes pegar el código del .dpr y del .pas del proyecto (usando la etiqueta code).

// Saludos

islu
15-03-2004, 17:32:11
Pero el problema me lo da cuando pongo como icono de la aplicación uno de más de 256 colores, es decir, necesito poder pasar el .res de la aplicación.

Muchas gracias.

roman
15-03-2004, 17:44:53
Tienes razón. Adjúntalo como .zip usando la opción 'Administrar Adjuntos' en 'Additional Options', debajo del cuadro del mensaje que escribas. Me parece que hay un límite de tamaño para los archivos adjuntos así que intenta con con el icono de menor tamaño que presente el problema.

// Saludos

islu
15-03-2004, 18:06:46
Bueno pues aqui va, solo debeis ejecutarlo con F9.

islu
15-03-2004, 18:13:49
:rolleyes: Solo debeis hacer un projecto, con un solo form, no importa que más llevem, llamadlo Project1. Reemplazad el Project1.res que os ha generado con este.

Muchas Gracias. :)

islu
15-03-2004, 18:16:05
Perdón, no os he dicho que antes de reemplazar el fichero, debéis estar fiuera de Delphi.

Muchas gracias de nuevo.

roman
15-03-2004, 18:32:39
Pues no sé qué decirte.

El icono que mandas no me causa ningún problema ni en Windows XP ni en Windows 2000.

Si dices que tan sólo poniendo este icono te causa problemas yo más bien sopecharía, como te indicó anteriormente marcoszorrilla de la tarjeta gráfica de la pc.

Por cierto, ¿podrías indicar exactamente qué dice la línea de código en la ventana del cpu cuando se detiene la ejecución?

// Saludos

marcoszorrilla
15-03-2004, 18:40:48
Pues acabo de hacer la prueba y funciona perfectamente.

Un Saludo.

islu
15-03-2004, 19:27:24
Es que no llega a sacarme ninguna línea, nada mas pulsar F9, me aparece la pantalla de CPU, la segunda línea menciona a ntddl.DbgUserBreakPoint, y el resto comandos tipo int,mov, etc..

Muchas gracias por vuestro interés, lamento el tiempo que os estoy robando.

roman
15-03-2004, 19:33:12
Vamos a intenta algo desesperado.

Coloca este código en la sección initialization de tu formulario y dinos si se corrige el problema al correr la aplicación desde el IDE.


procedure PatchINT3;
var
NOP : Byte;
NTDLL: THandle;
BytesWritten: DWORD;
Address: Pointer;

begin
if Win32Platform <> VER_PLATFORM_WIN32_NT then Exit;
NTDLL := GetModuleHandle('NTDLL.DLL');
if NTDLL = 0 then Exit;
Address := GetProcAddress(NTDLL, 'DbgBreakPoint');
if Address = nil then Exit;
try
if Char(Address^) <> #$CC then Exit;

NOP := $90;
if WriteProcessMemory(GetCurrentProcess, Address, @NOP, 1, BytesWritten) and
(BytesWritten = 1) then
FlushInstructionCache(GetCurrentProcess, Address, 1);
except
//Do not panic if you see an EAccessViolation here, it is perfectly harmless!
on EAccessViolation do ;
else raise;
end;
end;


// Saludos

islu
16-03-2004, 14:50:27
Perdona, pero no se como hacerlo. :-(

Puedes indicarme como, por favor.

Muchas gracias.

roman
16-03-2004, 16:21:05
Ese código está algo raro, yo lo sé. Deja te cuento el por qué.

Desde que comencé a usar Delphi en Windows 2000 y ahora en Windows XP me sucedían ocasionalmente comportamientos similares al que te sucede a tí aunque en otros casos; a veces colocando un ListView, a veces con un ImageList, etc.

Estuve buscando en la red y me encontré que esto del ntdll.DbgUserBreakPoint es conocido; al parecer algún programador en Microsoft se dejó una instrucción INT3 (punto de corte o 'break point') en el código de la librería ntdll.dll

El código que te puse lo publicó Peter Morris (conocido e los grupos de noticias de Borland) en http://www.howtodothings.com/showarticle.asp?article=654 y, en efecto, soluciona el problema.

No expliqué esto antes porque no sé a ciencia cierta si eso es lo que ocurre. Lo que sí es cierto, es que, de ser éste el problema, entonces no tienes de qué preocuparte ya que sólo se presenta cuando estás haciendo un 'debug' de la aplicación y no ya en ejecución.

Para usarlo simplemente pégalo en la sección initialization del formulario:


unit Unit1;

interface

uses
bla, bla, bla;

type
TForm1 = class(TForm)
end;

var
Form1: Form1;

interface

procedure PatchINT3;

{
Aquí pegas el código
}

initialization

// Llamada al procedimiento
PatchINT3;

end.


Si no es eso pues ya buscaremos por otro lado.

// Saludos

islu
17-03-2004, 17:08:49
Primeramente muchísimas gracias por todo el interés que os estais tomando; y lamento el tiempo que os estoy robando.

Por lo que me dices creo que ese es mi problema, pero es que no se donde ponerlo, pues la aplicación no llega ni a arrancar, en el "Application.Initialize;" he puesto un break point, y me sale antes de llegar a este punto.

Muchas gracias por vuestro interés.

roman
17-03-2004, 18:01:15
pues la aplicación no llega ni a arrancar, en el "Application.Initialize;" he puesto un break point, y me sale antes de llegar a este punto.

Quizá no lo sepas pero el código que tú ves en el archivo .dpr no es lo primero en ejecutarse. Hay de hecho muchísimo código que se ejecuta antes de llegar siquiera al primer begin.

Para empezar está todo el código de la unidad System, la única unidad omnipresente en Delphi, y luego todo el código de las secciones initialization de cada una de las unidades incluidas en el proyecto, tanto las que uno pone explicitamente como las que son incluidas dentro de otras, y creeme, son muchísimas.

De hecho, si te fijas, la primera línea de código en el archivo .dpr,

Application.Initialize

hace referencia a un objeto, Application. Como todo objeto en Delphi, éste debe ya estar creado antes de llamar a ninguno de sus métodos. Tal objeto se crea en la sección initialization de la unidad Forms.

El tipo de error al que te enfrentas seguramente se genera en alguna de estas secciones, razón por la cual jamás se llega ni siquiera al begin del dpr.

Puedes de hecho hacer un debug de todo esto habilitando la opción "Use debug dcus" en Project|Options|Compiler y comenzando la ejecución con F8 y continuando paso a paso con F7. Incluso, si uno es suficientemente paciente, es posible que alcances a ver el punto casi exacto donde se produce el error.

Pero antes de tal aventura, haz el experimento tal como te indiqué tan sólo para ver si por ahí va el problema. Más aún, dado que el error podría estarse produciendo antes de que se ejecuta la sección initialization del formulario sería mejor que crees una unidad nueva con sólo dicho código:


unit TestPacthInt3;

interface

implementation

procedure PatchINT3;
var
NOP : Byte;
NTDLL: THandle;
BytesWritten: DWORD;
Address: Pointer;

begin
if Win32Platform <> VER_PLATFORM_WIN32_NT then Exit;
NTDLL := GetModuleHandle('NTDLL.DLL');
if NTDLL = 0 then Exit;
Address := GetProcAddress(NTDLL, 'DbgBreakPoint');
if Address = nil then Exit;
try
if Char(Address^) <> #$CC then Exit;

NOP := $90;
if WriteProcessMemory(GetCurrentProcess, Address, @NOP, 1, BytesWritten) and
(BytesWritten = 1) then
FlushInstructionCache(GetCurrentProcess, Address, 1);
except
//Do not panic if you see an EAccessViolation here, it is perfectly harmless!
on EAccessViolation do ;
else raise;
end;
end;

initialization
PatchInt3;
end.


Así, tal cual. Copia, pega y guarda el archivo.

Incluye la unidad al principio de la cláusula uses del dpr:


program Project1;

uses
TestPatchInt3,
Forms,

etc.
...


para que sea la primera en ser procesada, aún antes de la unidad Forms.

// Saludos

roman
17-03-2004, 22:21:56
Luego de recorrer un rato los grupos de noticias de Borland estoy más convencido de que el problema se debe a lo que te he comentado. Algunos mensajes en dichos grupos hacen referencia explícita al uso de iconos con más de 16 colores.

Yo no me preocuparía mayormente, el hecho de que la aplicación se detenga en DbgUserBreakPoint significa que eso sólo ocurrirá al hacer un "debug" de la aplicación. Por cierto que, contrario a lo que se dijo en el primer mensaje de este hilo así como en su título, esto no es una excepción, es un "breakpoint" como el que podríamos nosotros poner en otras partes del código.

Algunas personas comentan que el problema se arregla instalando el service pack 2 de windows 2000 aunque otros afirman que ni con eso. De cualquier manera no está de más que te asegures de tener el último service pack instalado.

// Saludos

islu
18-03-2004, 19:29:33
GRACIIIIIAAAAAAAAAAAAAAASSSSSSSSSSSSS !!!!!!!!!

Por fin, ya me funciona, con la función PatchINT3, implementada como una unit nueva, puesta en primer lugar en el uses del dpr; tal y como me has indicado Roman.

Mil gracias, de verdad, mil gracias.

Espero que además de a mi, esto sirva a alguién más. Por cierto, tengo el Service Pack 2, y pese a ello seguía pasando.

GRACIAS.

roman
18-03-2004, 19:41:29
Por cierto, tengo el Service Pack 2, y pese a ello seguía pasando.


¡La de virus que has de tener en tu máquina! :D

¡A qué esperas y ponle ya el sp4!

Y cuando lo hagas vuelve a probar quitando PatchInt3 a ver si Microsoft corrigió el problema en este service pack.

// Saludos

jymy788
02-12-2004, 17:19:35
Yo no consigo que ese procedimiento me funcione y estoy hasta las narices de microsoft y sus puntos de ruptura, alguien me puede echar un cable? Me falta ponerme a llorar.

Gracias

islu
02-12-2004, 17:41:12
Hola a mi si me funciona, te cuento como lo he puesto.

1- He añadido el TestPacthInt3.pas al proyecto

2- Luego, he edité el fuente del proyecto ( Project-> View Source )

3- Pusé el TestPacthInt3.pas el primero, ya que el por defecto lo puso al final, y quedó asi :

program EJEMPLO;

uses
TestPacthInt3 in 'TestPacthInt3.pas',
Forms,
[...]

Con esto se me solucionó. Espero que te funcione. :)

jymy788
02-12-2004, 17:47:12
mi problema con esa unidad (TestPacthInt3.pas) es que al compilar el proyecto me da problemas ya que no encuentra un montón de cosas (utilizo delphi 7) y por ejemplono encuentra o reconoce lo siguiente

VER_PLATFORM_WIN32_NT
GetModuleHandle('NTDLL.DLL');
GetProcAddress(NTDLL, 'DbgBreakPoint');


con lo cual no puedo meter esa unidad tal cual y hacer lo del proyecto.

sabeis por qué puede ser?

jymy788
02-12-2004, 18:37:47
d7_ent_upd1_1.exe

Buscar este fichero en la página de Borlan, así se soluciona.

Gracias a todos.

Rodrigo_I
20-08-2010, 18:00:54
a mi me sirvio con D7 y el Service Pack 3 de XP

solo agregar que se debe poner : uses Types, SysUtils, Windows;