Am Montag, den 28.11.2005, 15:34 +0100 schrieb Gregor Jasny:
Daniel Leidert schrieb:
Ich habe ein Problem mit apt-ftparchive unter Debian. Wird das Programm via cron-Job aufgerufen, dann wirft es Fehlermeldungen wie
E: Sub-process gzip returned an error code (100)
Rufe ich das Programm aber von der Konsole auf, funktioniert alles. gzip ist natürlich installiert. Nun wurde mir vorgeschlagen, mittels gdb mal einen Blick auf den Stacktrace zu werfen. Wie muss ich gdb jetzt in den cron-job einbinden? Ich vermute mal mittels -batch und -x|-command. Der Fehler wird von dann von apt-pkg/contrib/fileutl.cc (Zeile 390) auf stderr ausgegeben (müsste ich da einen Break-Point setzen? - wahrschenlich müsste ich eher beim Aufruf von gzip den Break-Point setzen, richtig?). Könnte mir jemand bei dem Problem behilflich sein? Das Problem hindert aktuell debarchiver am korrekten Funktionieren und das ist sehr lästig. Allerdings bin ich beim Debuggen nicht so versiert.
Bevor Du dich mit gdb auseinandersetzt, probiere mal strace.
Danke. Natürlich hast du Recht. Manchmal übersieht man das offensichtliche.
Damit bekommst Du alle Systemaufrufe deines Programmes zu sehen. Der Aufruf sollte in etwa so erfolgen: strace -f apt-ftparchive 2> /tmp/strace.log
Klar. Allerdings mit -o.
Im Output selbst stehen dann auch die Returncodes der Systemaufrufe. Meist findet man dann ein ENOPERM, was auf ein Recteproblem hinweist.
Nein. Das ist es nicht. Das ist es:
[..]
./cron.9880:52:execve("/usr/bin/gzgzg", ["n/gzgzg", "-d"], [/* 8 vars */]) = -1 ENOENT (No such file or directory) ./cron.9880:53:execve("/bin/gzgzg", ["n/gzgzg", "-d"], [/* 8 vars */]) = -1 ENOENT (No such file or directory) ./cron.9881:52:execve("/usr/bin/gzgzg", ["n/gzgzg", "-d"], [/* 8 vars */]) = -1 ENOENT (No such file or directory) ./cron.9881:53:execve("/bin/gzgzg", ["n/gzgzg", "-d"], [/* 8 vars */]) = -1 ENOENT (No such file or directory) ./cron.9882:52:execve("/usr/bin/gzgzg", ["n/gzgzg", "-d"], [/* 8 vars */]) = -1 ENOENT (No such file or directory) ./cron.9882:53:execve("/bin/gzgzg", ["n/gzgzg", "-d"], [/* 8 vars */]) = -1 ENOENT (No such file or directory) ./cron.9886:52:execve("/usr/bin/gzgzg4é^P^A", ["n/gzgzg4\351\20\1", "-d"], [/* 8 vars */]) = -1 ENOENT (No such file or directory) ./cron.9886:53:execve("/bin/gzgzg4é^P^A", ["n/gzgzg4\351\20\1", "-d"], [/* 8 vars */]) = -1 ENOENT (No such file or directory)
Das müsste eigentlich jeweils (/usr)/bin/gzip heißen. Damit erklärt sich auch die 100-Fehlermeldung. Da ich von C++ herzlich wenig Ahnung habe, überlasse ich das vorerst dem Maintainer. Falls es jemanden interessiert oder helfen möchte: Debian BTS #341326.
Wenn Du doch gdb einsetzen willst, dann brauchst Du wahrscheinlich eine Datei in der der breakpoint gesetzt wird, das Programm gestartet und anschließend ein Backtrace ausgegeben wird:
Ich habe zur Zeit kein Linux zur Hand, aber es sollte in etwa so aussehen:
break apt-pkg/contrib/fileutl.cc:390 run bt (evtl. auch btfull oder so ähnlich) disable 1 (Breakpoint 1 deaktivieren) continue
Dieses Script gibst Du dem gdb mit (ich glaube mit -x). Bevor Du das alles in die Crontab einträgst, solltest Du es erst mal im gdb selbst ausprobieren. apt-ftparchive sollte auf jeden Fall mit Debugsymbolen versehen sein (-ggdb beim Übersetzen).
Danke. Sollte sich der zuständige Maintainer nicht darum kümmern, werde ich das näher ins Auge fassen (dank strace könnte ich die Break-Points jetzt auch besser setzen). Ich muss mich dringend intensiver mit gdb befassen. Hilft immer, wenn man den Fehler schon lokalisiert hat, wenn man einen Bug-Report sendet :)
Danke noch einmal, MfG Daniel