Exception-Fehler

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu CodeGuard-Fehler - Index

Wenn eine System-Exception auftritt, meldet CodeGuard den Laufzeitfehler unter Verwendung der vom Betriebssystem gelieferten Informationen. Falls möglich, wird im CodeGuard-Protokoll die Stelle angegeben, an der die Anwendung die Exception verursacht hat. CodeGuard fängt die Exception nicht ab, leitet sie nicht um und greift auch nicht anderweitig in das normale Programmverhalten ein.

Exceptions werden von CodeGuard folgendermaßen gemeldet:

  • General Protection Fault (Allgemeine Schutzverletzung)
  • Divide by zero (Division durch Null)

General Protection Fault (Allgemeine Schutzverletzung)

Im folgenden Beispiel stellt CodeGuard Informationen zu einer allgemeinen Schutzverletzung bereit (Intel-System-Exception 0xD). Zusätzlich zu der Quelltextzeile, die die Exception verursacht hat, wird auch protokolliert, wo der Speicher zugewiesen und wieder freigegeben wurde. Der gemeldete falsche Wert ergibt sich durch den Zugriff auf ein Byte-Muster, mit dem CodeGuard ungültige Speicherpositionen identifiziert.

Error 00003. 0x400003 (Thread 0x0090):
Exception 0xC0000005: Access violation at 0x80828082.
| gpfault.c line 32:
|    {
|       q = p[3];
|>      *q = 1;
|    }
| }
Call Tree:
   0x004010E5(=GPFAULT.EXE:0x01:0000E5) gpfault.c#32
   0x00406B29(=GPFAULT.EXE:0x01:005B29)

The bogus value (0x80828082) was most likely retrieved by accessing a(n)
 memory block that has already been freed
The memory block (0x008322A4) [size: 16 bytes] was allocated with malloc
| gpfault.c line 17:
|     int *q;
|
|>   p = malloc(sizeof(*p) * 4);
|
|    /*  Initialize p */
Call Tree:
   0x00401094(=GPFAULT.EXE:0x01:000094) gpfault.c#17
   0x00406B29(=GPFAULT.EXE:0x01:005B29)

The memory block (0x008322A4) was freed with free
| gpfault.c line 17:
|     int *q;
|
|>   p = malloc(sizeof(*p) * 4);
|
|    /*  Initialize p */
Call Tree:
   0x00401094(=GPFAULT.EXE:0x01:000094) gpfault.c#17
   0x00406B29(=GPFAULT.EXE:0x01:005B29)

Divide by zero (Division durch Null)

Im folgenden Beispiel identifiziert CodeGuard die Stelle im Quelltext, an der eine Division durch Null stattfindet (Intel-System-Exception 0x0) .

Error 00001. 0x400000 (Thread 0x008B):
Exception 0xC0000094:
| ZERODIV.C line 9:
| {
|  x = 1;
|> return x / y;
| }
|
Call Tree:
   0x0040109C(=ZERODIV.EXE:0x01:00009C) ZERODIV.C#9
   0x00406321(=ZERODIV.EXE:0x01:005321)

Siehe auch