PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : illegal instruction ??



Benngun
12-05-2004, 14:35
hi ich hab ein Programm das eine Weile läuft und dann auf einmal Abschmiert (AIX) dann erzeugt es nen Core. den hab ich in den ddd geladen und alles was ich angezeigt bekomme ist:

core was generated by `pbbparClient'.
Program terminated with signal 4, Illegal instruction.
0x00000000 in ?? ()
(gdb) frame 0

wenn ich dann auf Backtrace im ddd klicke bekomme ich
#0 0x00000000 in ?? ()

also ich bekomme keine Funtion raus von wo diese illegale instruktion herkommt. Bisher habe ich auf dem Weg ganz gut herausbekommen können wo das Problem liegt, aber momentan will es absolut nich :(

kommt das Problem jemanden bekannt vor? oder gibt es gute andere Wege herauszufinden woher das Problem kommen könnte? ein normales hindebugen ist nicht drinn da das Programm erstmal ne weile läuft das im debuger nachzustellen währe eine Strafarbeit ....

anda_skoa
12-05-2004, 15:11
Da der Backtrace nicht viel hergibt, vermute ich mal, dass die Applikation ohne Debuggingsymbole compiliert wurde.

Kompilier sie mal mit und dann sollte der Backtrace auch eine Callstack anzeigen können.

Ciao,
_

Benngun
12-05-2004, 15:18
Das war mein erster Ansatz. zuerst wollte sich der Core partout nicht öffnen lassen. daraufhin hab ich das Prgramm mit Debuginfos kompiliert und neu losgejagt. Nur der Core will mir noch nicht so recht verraten was los is :confused:

Thomas Engelke
12-05-2004, 15:59
Ein wenig abstrakt, aber zum Debuggen ziemlich nützlich: Wenn die Exception fliegt, nimm dir die Rücksprungadresse vom Stack und such' die dementsprechende Funktion dazu. Die kannst du mit den Debuginfos abgleichen und so herausbekommen, welche Zeile bzw. welcher Code den aktuellen Funktionscall getätigt hat.

TME

RapidMax
12-05-2004, 23:16
Die Fehlerursache kommt daher, dass anscheinend Code-bzw. Nicht-Code-Bereiche ausgeführt werden, welche keine gültigen Instruktionen enthalten (z.B. Sprung irgendwo ins Nirvana). Die CPU löst dann einen Invalid-Instruction-Interrupt aus, welcher das OS mit Signal 4 quittiert.

Nun, wenn du es nicht schaffst einen Backtrace anzuzeigen, dann hilft dir vermutlich der "Debugger für Arme" - printf - dabei die Stelle einigermassen zu lokalisieren.

Beispiel:

#include <stdio.h>

#define WHERE_AM_I(arg_) \
printf(__FILE__ ":%d " arg_ "\n", __LINE__);

int main(){
WHERE_AM_I()
WHERE_AM_I("Am Ende")
}

Gruss, Andy