Hallo,
Was außer strace und gdb gibt es noch, um mysteriösen Problemen auf den Grund zu Gehen? Ich habe hier das Problem, daß ein Callback aufgerufen wird, und beim Rücksprung kommt er nicht mehr an. Der GDB zeigt als letzte Zeile den Aufruf des Callbacks, und strace schweigt sich aus, das Programm scheint also wirklich festzuhängen und verbraucht auch recht viel CPU-Zeit, nur tut es darin halt nichts.
Josef Spillner
On Wednesday 18 July 2001 02:37, Josef Spillner wrote:
Was außer strace und gdb gibt es noch, um mysteriösen Problemen auf den Grund zu Gehen?
efence und andere Memory-Debug-Utils.
Ich habe hier das Problem, daß ein Callback aufgerufen wird, und beim Rücksprung kommt er nicht mehr an. Der GDB zeigt als letzte Zeile den Aufruf des Callbacks, und strace schweigt sich aus, das Programm scheint also wirklich festzuhängen und verbraucht auch recht viel CPU-Zeit, nur tut es darin halt nichts.
Für solche Probleme ist ein Debugger schon das korrekte Tool. Alles höher entwickelte würde eine KI benötigen, die das Halteproblem lösen kann... ;-)
Ich tippe mal einfach auf Buffer-Overrun: mach mal kurz vor dem Rücksprung einen backtrace (gdb: bt) und schau, ob das logisch aussieht. Bzw., wenn Du auf eine Funktionsvariable springst: schau sie Dir mal direkt nach dem Einsprung in die Funktion und direkt vor dem Sprung auf die Variable mal an.
Beispiel:
void xyz(myfunctype func) { -> print func ==> 0xff789012 /*viel Code*/ -> print func ==> 0xab567890 func(); -> Absturz }
Im Fall oben wurde die Variable func irgendwie überschrieben. Entweder durch direkte Zuweisung (heißt eine Variable ähnlich? Tippfehler? Denkfehler?) oder durch Pufferüberläufe (wurden alle Strings auf die korrekte Größe gebracht? Wird geprüft, dass der Platz reicht? Das selbe für andere Arrays.)
Konrad
lug-dd@mailman.schlittermann.de