Forum: PC-Programmierung SW-Projetleiter Fragt: "Für was braucht man einen Debugger?"


von Michael (Gast)


Lesenswert?

Hallo,

heute hatte ich eine interessante Frage von einem Projektleiter als ich 
vorgeschlagen habe in den Linux Kernel einen Debugger zu integrieren:

Ich weiß was ein Debugger ist, wir haben bisher ohne Debugger 
gearbeitet, erklär mir warum Du den benötigst.

Meine Argumente waren:

- Debugging in Funktionen (Lokale Variabeln)
- Breakpoint's und StepByStep Debugging um den Controlflow zu prüfen
- Stack-Auslastung zu prüfen (ist noch Speicher im Stack vorhanden)

Risiko für's Projekt wurde mit 0 Abgeschätzt, Aufwand mit 1-2 Tagen.

Die Argumente haben ihn nicht überzeugt.

Hat jemand Ideen für weitere Argumente?

Vielen Dank,

Grüße

Michael

von Peter II (Gast)


Lesenswert?

Michael schrieb:
> Hat jemand Ideen für weitere Argumente?

und warum keinen vorhanden Debugger verwenden? Und warum sollte ein 
Kernel einen debugger haben? Ein debugger ist doch ein extra tool.

von Michael (Gast)


Lesenswert?

Hallo,

liegt daran das wir einen Kernelspace-Debugger benötigen und im 
aktuellen Linux das wir verwenden keiner integrert ist, was sich jedoch 
beheben lässt. Kernelspace-Debugging ist eben nicht Userspace-Debugging.

von W.S. (Gast)


Lesenswert?

Michael schrieb:
> Die Argumente haben ihn nicht überzeugt.

Würden mich auch nicht überzeugen.

BTW: Wie denkst du dir eigentlich das "Debuggen von lokalen Variablen" 
in Funktionen? bzw. was willst du da eigentlich sehen? Normalerweise 
räumt der Compiler den Code beim Optimieren so großzügig um, daß du da 
erstmal garnix siehst - jedenfalls deinen Quellcode selten bis nie 
wirklich wiedererkennst.

Ansonsten guckt man sich den Stackverbrauch nicht per Debugger an, 
sondern benutzt die bei der Toolchain vorhandenen 
Profilier-Möglichkeiten. Sowas kann im Prinzip schon ein halbwegs 
intelligenter Linker liefern.

Michael schrieb:
> StepByStep Debugging um den Controlflow zu prüfen

Ah ja, den Controlflow.. Schreib nicht so geschwollen daher, sondern sag 
lieber, was du eigentlich meinst - es sei denne, daß es dir selbst nicht 
so recht klar ist. Du willst also dein selbstgeschriebenes Opus Zeile 
für Zeile mal durchgehen, weil du dir nicht sicher bist, was du da 
eigentlich geschrieben hast und der Compiler das übersetzt, was du 
geschrieben hast und nicht das, was du eigentlich gemeint bzw. 
beabsichtigt hast. Jahaha, das ist des C-Programmierers Schicksal.

W.S.

von Debugger (Gast)


Lesenswert?

Michael schrieb:
> Hat jemand Ideen für weitere Argumente?

Ja, für deinen Chef. Bau einfach das gute alte printf ein und wenn du 
besser bist, dann programmierst du gleich ordentlich. Damit meine ich, 
du weißt was du tust und musst nicht erst ein anderes Programm benutzen 
um deine Arbeit zu verifizieren/falsifizieren. Der gute alte API-Test 
ist auch schneller als die 16h + Debug-Sessions.


---

von D. I. (Gast)


Lesenswert?

Im Kernel nimmt man wohl eher printk statt printf ;)

von Michael (Gast)


Lesenswert?

Hallo,

stimmt, der Compiler reorganisiert den Code innerhalb der Funktion, ist 
normal. Ich habe schon Low-Level Debugging gemacht, ist kein Hindernis 
für mich, braucht etwas Training, dann geht's.

Man kann die maximale Stackauslastung sehen wenn man den Stack beim 
Startup mit einem Muster beschreibt, man sieht dann wie weit der maximal 
ausgelastet war, vor allem wenn man einen Crash hat und im Error-Hook 
ist. Dann kann man Rückschlüsse über den Stack machen aus welchem Modul 
der Fehler kommt. Besser zur Stackanalyse sind natürlich statische 
Methoden, absint liefert dafür gute Tools, hätte ich gern, hab ich 
vorgeschlagen, abgeleht.

Ich hab ganz bewusst nicht "Zeile für Zeile" geschrieben, denn das kommt 
beim Compilieren nicht raus, wie Du ja zu Anfang richtig bemerkt hast. 
Vom "Correctness by Construction" Ansatz bin ich voll überzeugt, ich 
schreibe nichts ohne vorher eine Design-Spezifikation geschrieben zu 
haben, vorher denken und reviewen hilft die Anzahl der Fehler massiv zu 
senken. Design-Review ist eine sehr mächtige Methode. Drauf los 
programmieren ist einfach nur dumm weil man sehr viele Fehler im Code 
hat, aber einige stehen drauf, ich nicht.

Dr. Dewar hat zu Ada etwas interessantes gesagt: "You can write 
Junk-Code in any language". C ist nicht die beste Sprache auf dem 
Planeten, aber ich kann mit C leben. Jede Sprache hat ihre eigenen 
Probleme, man muss die Probleme und Limits der Sprache kennen und 
umgehen. Daher gibt's ja auch MISRA-C das einige gefährliche 
Code-Konstrukte ausschließt.

Debugging mache ich um gezielt Fehler zu suchen die sich mit 
Instrumentierung und anderen Methoden nicht, oder nur schwierig finden 
lassen.

Güße

Michael

P.S. http://www.absint.com/

von Debugger (Gast)


Lesenswert?

D. I. schrieb:
> Im Kernel nimmt man wohl eher printk statt printf ;)

Ups, ja, es ist schon etwas länger her mit meinem letzten Kontakt zum 
Kernel. Das Problem bei der Programmierung (Treiber) hat sich damals 
aber auch ergeben und durch das "printk" im Treiber konnte ich die API 
verifizieren.

Lokale Variabeln, Breakpoint's, StepByStep, Controlflow und 
Stack-Auslastung im KERNEL zu prüfen hört sich für mich nach anderen 
Problemen an.

von Ppp (Gast)


Lesenswert?

Sowas fragt man seinen Chef auch nicht. Sowas macht man einfach. Im 
Rahmen der normalen Entwicklungsarbeit darf man sich ja wohl sein 
Environment so zusammenkonfigurieren wie man es gerade braucht.

Wen er fragt was man gerade macht, dann antwortet man wahrheitsgemäß, 
dass man im Kernel rumpopelt weil man einen Fehler sucht.

von Debugger (Gast)


Lesenswert?

Ppp schrieb:
> Wen er fragt was man gerade macht, dann antwortet man wahrheitsgemäß,
> dass man im Kernel rumpopelt weil man einen Fehler sucht.

Er hat wohl auf die Frage "Dr. Dewar" zitiert ...

von Gerd E. (robberknight)


Lesenswert?

Michael schrieb:
> Meine Argumente waren:
>
> - Debugging in Funktionen (Lokale Variabeln)
> - Breakpoint's und StepByStep Debugging um den Controlflow zu prüfen
> - Stack-Auslastung zu prüfen (ist noch Speicher im Stack vorhanden)

Sind das für Dich Argumente?

Für mich ist das ne Liste von schönen Features. Argumente werden da erst 
draus, wenn Du erklärst wie die Dir beim Entwickeln helfen und was sie 
am Ende bei Deinem Projekt für Vorteile bringen.

> Risiko für's Projekt wurde mit 0 Abgeschätzt, Aufwand mit 1-2 Tagen.

So, so. Du bist Dir also wirlich zu 100% sicher, daß Du mit diesem 
Kernel-Debugger die oben gelisteten Features in Deinem Kernelcode 
erreichen kannst?

Meine Erfahrung mit Kernelcode ist eher, daß man da nicht so "einfach 
mal eben" debuggen kann. Denn der Debugger verändert das Verhalten des 
Kernels. Gerade wenn Du es mit falschen Locking-Strukturen, 
Nebenläufigkeiten oder Speicherallokierung zu tun hast, tritt der Bug 
mit dem Debugger plötzlich nicht mehr oder an ganz anderer Stelle als 
ohne Debugger auf.

Ich würde im Kernel möglichst minimalinvasiv vorgehen.

von Alexander S. (alexander_s45)


Lesenswert?

Es gibt doch schon kernel debugger für Linux kdb auf Assembler Ebene. 
Ansonsten gibts noch den kgdb der für C funktioniert, dafür wir aber ein 
zweiter PC benötigt. Wenn man für ein Embedded System programmiert, 
verwendet man besten einen JTAG Debugger.

von Debugger (Gast)


Lesenswert?

Alexander S. schrieb:
> Es gibt doch schon kernel debugger für Linux kdb auf Assembler Ebene.
> Ansonsten gibts noch den kgdb der für C funktioniert, dafür wir aber ein
> zweiter PC benötigt. Wenn man für ein Embedded System programmiert,
> verwendet man besten einen JTAG Debugger.

Es gibt alles, man muss nur abschätzen können ob sich der Aufwand lohnt 
oder nicht. Der Debugger ist das letzte und nicht das erste Mittel der 
Wahl. Wenn ein Programmierer einen Debugger bedient ist er entweder 
grade zu faul und hat viel Zeit für Spielerei oder es ist wirklich etwas 
im argen.

....

von Sam P. (Gast)


Lesenswert?

Zu der Tatsache, dass es den Debugger schon gibt (siehe Vorredner) nur 
noch eine weitere Idee, die ich gerne Umsetze:

Debugging per Testcase. Wenn was nicht funktioniert, mach ich da gleich 
einen automatisierten Test von, der (wo möglich) interne Zustände mit 
ihren erwarteten Werten überprüft. So erhalte ich wertvollen Testcode, 
der noch viele Jahre nützlich sein wird, und komme der Ursache sehr 
nahe, da der Testcode ja gleich Alarm schlägt, sobald das Verhalten 
nicht mehr stimmt.

von Debugger (Gast)


Lesenswert?

Sam P. schrieb:
> Zu der Tatsache, dass es den Debugger schon gibt (siehe Vorredner) nur
> noch eine weitere Idee, die ich gerne Umsetze:
>
> Debugging per Testcase. Wenn was nicht funktioniert, mach ich da gleich
> einen automatisierten Test von, der (wo möglich) interne Zustände mit
> ihren erwarteten Werten überprüft. So erhalte ich wertvollen Testcode,
> der noch viele Jahre nützlich sein wird, und komme der Ursache sehr
> nahe, da der Testcode ja gleich Alarm schlägt, sobald das Verhalten
> nicht mehr stimmt.

API-Test viel schneller und sicherer. Interne Zustände vom Debugger, ihr 
scheint euren Code wirklich nicht zu vertrauen, ende aus.

von Sam P. (Gast)


Lesenswert?

Debugger schrieb:
> API-Test viel schneller und sicherer. Interne Zustände vom Debugger, ihr
> scheint euren Code wirklich nicht zu vertrauen, ende aus.

Wer redet denn von internen Debugger-Zuständen?

Systematischer Test-Code hat nichts mit dem Vertrauen in den eigenen 
Code zu tun. Solange du menschlich bist, wirst du Fehler machen. Wie 
dein einleitender Satz, der kein Verb. Oder das Missverständnis mit dem 
Debugger.

Darum braucht man eine Testsuite.

Ob man nun reine API-Tests macht oder Unit-Tests oder was auch immer, 
das ist zweitrangig. Siehe auch "black-box" vs. "white-box" testing. 
Wichtig ist nur der Nutzwert, und ein white-box Test kann eben auch als 
Debughilfe verwendet werden.

von Ppp (Gast)


Lesenswert?

Debugger schrieb:
> Der Debugger ist das letzte und nicht das erste Mittel der
> Wahl. Wenn ein Programmierer einen Debugger bedient ist er entweder
> grade zu faul und hat viel Zeit für Spielerei oder es ist wirklich etwas
> im argen.
>
> ....

Solche Sprüche kommen normalerweise von Typen die zu blöd sind einen 
Debugger zu bedienen.

Ich vermeide mit solchen Typen zusammen zu arbeiten. Man bekommt scheiss 
Code, haufenweise Bugs, dumme Sprüche und darf hinter den "unfehlbaren" 
Angebern aufräumen.

von Debugging ist fein aber bringts auch Geld rein? (Gast)


Lesenswert?

Michael schrieb:
> Meine Argumente waren

Deine Argumente mögen technisch richtig sein. Wenn man aber einen BWLer 
überzeugen will, bzw. jemanden der so denkt wie ein BWLer, dann muss 
eine der beiden folgenden Fragen mit "ja" beantwortet werden:

-Wird durch den Einsatz eines Debuggers der Gewinn erhöht?
-Werden durch den Einsatz eines Debuggers die Kosten gesenkt?

Das ist die Sprache die diese Leute verstehen.

Alternativ kann es vielleicht auch konkrete Probleme im aktuellen 
Projekt geben, oder in vergangenen Projekten gegeben haben, die den 
Einsatz eines Debuggers rechtfertigen. Gibt es diese? Kannst du sie 
konkret benennen? Also nicht "das und jenes könnte passieren", sondern 
"genau dieses Problem ist aufgetreten"?

Firmen sind oft träge. Kleine vielleicht nicht so sehr aber die großen 
Konzerne sind dafür bekannt. Da braucht man schon gute Argumente wenn 
man was ändern will. Aus Firmensicht sind technische Argumente allein 
für eine Umstellung leider oft nicht ausreichend, auch wenn die 
Entwickler das gerne so hätten.

Alternativ könntest du dir auch einen Arbeitgeber suchen, der für seinen 
Einsatz von Debuggern bekannt ist ;-)

von Debugger (Gast)


Lesenswert?

Ppp schrieb:
> Solche Sprüche kommen normalerweise von Typen die zu blöd sind einen
> Debugger zu bedienen.

Für die Bedienung bin ich eigentlich nicht zu blöd, meine ich :-).

> Ich vermeide mit solchen Typen zusammen zu arbeiten. Man bekommt scheiss
> Code, haufenweise Bugs, dumme Sprüche und darf hinter den "unfehlbaren"
> Angebern aufräumen.

Ach komm, jetzt bist du auch nicht besser als die "Unfehlbaren", eben 
ein kleiner Weltretter, mit denen ich vermeide zusammen zu arbeiten.

von Michael (Gast)


Lesenswert?

Hallo,

leider ist der Projektleiter kein BWL'ler, wäre es einer dann wäre es 
mangelnde Fachkenntnis aufgrund einer anderen Ausbildung und ich könnte 
die Entscheidung nachvollziehen.

Die Frage ob etwas Geld bringt lässt sich oft schwer berechnen, ist 
meist empirisch oder gefühlt, nicht faktisch belegt. Bringt eine 
Firmen-Fahne oder eine Fußmatte Geld? Nein, die Fußmatte hat mir noch 
nie im Projekt etwas genutzt, trotzdem haben wir Fußmatten. Kann ein 
Debugger helfen die Kosten zu senken und mehr Gewinn zu erwirtschaften? 
La, manche Fehler könnten sich mit dem Debugger schneller finden lassen, 
ein Debugger hat Potential den Gewinn zu erhöhen, die Fußmatte nicht.

Nicht ohne Grund kaufen Firmen Lauterbach-Debugger,... aber ich habe 
noch nie eine Berechnung gesehen die den finanziellen Nutzen errechnet. 
Man würde zwei Gruppen benötigen, eine mit Debuggern, eine ohne, die das 
selbe implementieren. Kennt jemand dazu wissenschaftliche Studien?

Grüße

Michael

von Reinhard Kern (Gast)


Lesenswert?

Michael schrieb:
> Man würde zwei Gruppen benötigen, eine mit Debuggern, eine ohne, die das
> selbe implementieren.

Da müsstest du die Besetzung auslosen, damit das Ergebnis nicht 
verfälscht wird: es gibt eben verschiedene Programmierstile, z.B. den 
hirn-orientierten und den debugger-orientierten. Ich bevorzuge ersteren 
und überlege lange beim Codieren, um möglichst wenige Fehler zu 
produzieren, denn für jeden Fehler den ich nicht mache brauche ich weder 
Zeit noch Debugwerkzeuge.

Ich habe aber auch im Lauf der Jahre Programmierer kennengelernt, die 
völlig gegensätzlich arbeiten: übertrieben gesagt, jedes beliebige 
Programm besteht erst mal aus einem einzelnen NOP-Befehl, und dann wird 
der Debugger gestartet und gesucht, warum das Programm nicht das macht 
was es soll. Hat man alle Fehler debuggt ist das Programm fertig. 
Selbstredend verfügen solche Programmierer über eine optimale 
Debug-Ausstattung, und sie behaupten in der Regel, sie kämen so 
wesentlich schneller ans Ziel als wenn sie über Algorithmen usw. lange 
nachdenken würden. Bestätigen kann ich das nicht.

Ich benutze Debugger sofern vorhanden, z.B. in einer IDE, kann aber auch 
ohne arbeiten - schon deswegen weil es die in der Gründerzeit garnicht 
gab, man musste sich selbst was schreiben, z.B. LED an bei Eintritt in 
eine Routine und LED aus am Ende.

Gruss Reinhard

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.