Kann man rausfinden ob Programm Debug oder Release ist?
-
Hallo,
ich habe unter Linux ein in C++ geschriebenes Programm foo. Kann ich irgendwie herausfinden, ob das Programm im Debug Modus (also -g) oder Release Modus (also -O3) kompiliert wurde?
-
Man kann ein Programm auch mit -O3 -g compilieren. Und dann?
Ob das Programm Debugsymbole enthält, sollte sich mit
nm -a
herausfinden lassen oder wenn man es im Debugger lädt.
-
nm -a liefert mir eine List der Funktionen. Woran seh ich jetzt, ob das eine Debug Version ist?
Laeuft ein Programm mit -O3 -g genauso schnell wie eines mit nur -O3?
-
Tester11 schrieb:
nm -a liefert mir eine List der Funktionen. Woran seh ich jetzt, ob das eine Debug Version ist?
Laeuft ein Programm mit -O3 -g genauso schnell wie eines mit nur -O3?
Jop.
-
Tester11 schrieb:
nm -a liefert mir eine List der Funktionen. Woran seh ich jetzt, ob das eine Debug Version ist?
Guck in die man-Page: Wenn da Einträge mit 'N' sind, dann sind das Debugsymbole. Sie sollten ganz am Anfang der Ausgabe auftauchen.
Details kannst du dann mit
objdump
oderreadelf
angucken.Du wirst feststellen, dass du in 99% der Fälle Debugsymbole von Bibliotheken geerbt haben wirst. Die kannst du mit
strip
los werden.Laeuft ein Programm mit -O3 -g genauso schnell wie eines mit nur -O3?
Sie sind größer und brauchen daher eventuell eine tausendstel Sekunde länger zum Laden. Für die Ausführungsgeschwindigkeit sind Symboltabellen vollkommen wumpe.
-
SeppJ schrieb:
Sie sind größer und brauchen daher eventuell eine tausendstel Sekunde länger zum Laden. Für die Ausführungsgeschwindigkeit sind Symboltabellen vollkommen wumpe.
Werden die Debugsymbole überhaupt geladen?
Also bei Win wird soweit ich mich erinnere das Programm relativ schlicht per filemapping (mmap und so) in den Speicher geblendet und die Seiten, auf die dann tatsächlich zugegriffen wird, werden wie üblich durch page fault eingelagert.
Dachte, linux macht das im Prinzip auch so.
Wenn dann die Debug-Infos nicht über den ganzen Code verteilt sind, sondern hinter dem Code liegen, dürften sie im normalen Programmlauf gar nicht angefaßt werden, keinen Mehrbedarf an Ram verursachen und überhaupt.
Das ist nur eine wilde Mutmaßung. Falls jemand zufällig auswendig weiß, ob ich Quatsch rede oder zufällig getroffen habe, bitte melde Dich.
-
@volkard: Das war ehrlich gesagt nicht genau gewusst meinerseits. Ich hatte immer gedacht, dass die Datei gänzlich geladen wird. Wenn du da anderes weißt, dann wird das wohl so sein. Mal eben Wikipedia durchlesen...Ja, zumindest bei ELF ist das so. Es wird sogar noch nicht einmal Zeit dadurch verloren, wenn im Header Einträge für die Verweise auf die Debugsymbole übersprungen werden, da diese, wenn ich das richtig verstanden habe, woanders stehen als die Verweise auf das eigentliche Programm.
-
Tut Linux Programme/SOs überhaupt laden, oder bloss mappen (und das was gebraucht wird "lädt sich dann von selbst")?
-
Also ich würd mal davon ausgehen dass praktisch jedes OS das Virtual Memory verwendet Images einfach mappen tut, alles Andere wär doch blöd!?
-
Stümmt.
Die Frage die ich hätte stellen sollen: weiss jmd. wieviel Code eines gemappten SOs reingeladen wird, beim ersten Zugriff auf das erste Byte? Nur eine 4K Page? 10 4K Pages? 100? Eine 1 MB Page? Oder gar noch mehr?
Nur eine Page 4K wäre IMO irre, dann müsste sich das OS das ganze Image pageweise zusammenstückeln, und das würde viel länger dauern als es am Stück reinzuladen. Alles auf einmal, unabhängig davon wie gross das Image ist, würde dann aber vermutlich auch wieder bremsen.
Wäre natürlich auch interessant wie Windows das macht, nur bei Linux werden es vermutlich mehr Leute wissen, weil der Code frei zugänglich ist
-
hustbaer schrieb:
Nur eine Page 4K wäre IMO irre, dann müsste sich das OS das ganze Image pageweise zusammenstückeln, und das würde viel länger dauern als es am Stück reinzuladen. Alles auf einmal, unabhängig davon wie gross das Image ist, würde dann aber vermutlich auch wieder bremsen.
Ja, man hätte eine riesige Startverzögerung, bei schlimmstenfalls einer lahmen Drehplatte und 100 Dateifragmenten von einer ganzen Sekunde!
Ich würde zuerst an folgenden Kompromiß denken: Das Mappen und Einlagern bleibt Seitenweise (4k). Pro neuer 4k-Seite muß irgendwas teures passieren, was nachlädt. Wi eteuer mag sowas sein, ohne den Plattenzugriff zu zählen? 200 Takte? Ach, sagen wie 1000 Takte. Dann schafft man 1Mio davon in einer Sekunde. Keine Ahnung, wie lange ein page fault dauert.
Und an völlig anderer Stelle würde ich Dateiweises readahead von sagen wir mal 2MB machen, um die Dateizugriffe zu linearisieren und bei vielen page faults nicht auf die Platte warten zu müssen, sondern die Daten sofort aus dem Platten-Cache liefern zu können.
-
Klingt gut.
Gekauft