Forum: PC-Programmierung .NET: Was ist der Unterschied zwischen BIN- und OBJ-Verzeichnis?


von Ralf (Gast)


Lesenswert?

Hi,

wenn ich ein Programm in Release- bzw.Debug-Konfiguration erstelle, 
werden die beiden Verzeichnisse BIN und OBJ angelegt.
Im BIN-Ordner gibt's dann die Unterverzeichnisse Debug und Release, im 
Order OBJ gibt's den x86-Ordner und dann jeweils Debug- und 
Release-Ordner.

Die Frage ist nun, was sind die Unterschiede bzw. aus welchem Ordner 
zieht man die "endgültige/offizielle" Variante?
Bei den Release-Varianten fehlt jeweils die PDB-Datei, welche für 
Debuginfos zuständig ist.
In den jeweiligen Verzeichnissen des OBJ-Ordners befinden sich 
zusätzlich noch die Dateien "ResolveAssemblyReference.cache" und 
"<ProjectName>.csproj.FileListAbsolute.txt".

Ich finde es etwas verwirrend, vielleicht kann jemand Licht ins Dunkel 
bringen :)

Ralf

von Jasch (Gast)


Lesenswert?

Ralf schrieb:
> Hi,
>
> wenn ich ein Programm in Release- bzw.Debug-Konfiguration erstelle,
> werden die beiden Verzeichnisse BIN und OBJ angelegt.
> Im BIN-Ordner gibt's dann die Unterverzeichnisse Debug und Release, im
> Order OBJ gibt's den x86-Ordner und dann jeweils Debug- und
> Release-Ordner.
>
> Die Frage ist nun, was sind die Unterschiede bzw. aus welchem Ordner
> zieht man die "endgültige/offizielle" Variante?

BIN auf jeden Fall.

> Bei den Release-Varianten fehlt jeweils die PDB-Datei, welche für
> Debuginfos zuständig ist.

Nur weil die Optionen so eingestellt sind, man könnte auch fürs 
Release-Build Debuginfos erstellen lassen, ist auch oft sinnvoll.

> In den jeweiligen Verzeichnissen des OBJ-Ordners befinden sich
> zusätzlich noch die Dateien "ResolveAssemblyReference.cache" und
> "<ProjectName>.csproj.FileListAbsolute.txt".
>
> Ich finde es etwas verwirrend, vielleicht kann jemand Licht ins Dunkel
> bringen :)

Das OBJ-Verzeichnis ist für temporären Kram, wird wohl auch für C++ viel 
mehr benutzt als für C#. Ignorier es einfach.

von Ralf (Gast)


Lesenswert?

> BIN auf jeden Fall.
> ...
> Das OBJ-Verzeichnis ist für temporären Kram, wird wohl auch für C++ viel
> mehr benutzt als für C#. Ignorier es einfach.
Okay, danke für die Info.

> Nur weil die Optionen so eingestellt sind, man könnte auch fürs
> Release-Build Debuginfos erstellen lassen, ist auch oft sinnvoll.
Aber... isses dann nicht das gleiche? Obwohl... es wäre die 
code-optimierte Variante mit Debuginfos, richtig?
Aber was bringen die Debuginfos auf einem System auf dem kein Debugger 
installiert ist? Oder wird die Ausgabe, die man beispielsweise mit 
"debug.println" macht dann irgendwo anders hin umgeleitet, 
beispielsweise in eine Datei?

Ralf

von Jasch (Gast)


Lesenswert?

Ralf schrieb:
>> Nur weil die Optionen so eingestellt sind, man könnte auch fürs
>> Release-Build Debuginfos erstellen lassen, ist auch oft sinnvoll.
> Aber... isses dann nicht das gleiche? Obwohl... es wäre die
> code-optimierte Variante mit Debuginfos, richtig?

Genau. Macht beim Debuggen dann auch "interessante" Effekte, weil der 
Compiler beim Optimieren gern Code-Blöcke umarrangiert. Trotzdem besser 
als ohne Debuginfos.

> Aber was bringen die Debuginfos auf einem System auf dem kein Debugger
> installiert ist?

Nix, der Kunde soll ja nicht debuggen und bekommt die Debuginfos auch 
nicht mitgeliefert.

> Oder wird die Ausgabe, die man beispielsweise mit
> "debug.println" macht dann irgendwo anders hin umgeleitet,
> beispielsweise in eine Datei?

Nein, das wäre dann doch zu viel Magie.

Es geht einfach darum dass man das an den Kunden gegebene Binary (eine 
garantiert bitgenaue Kopie) selber debuggen kann falls schwierige 
Probleme nachvollzogen werden müssen, das muss also aufgehoben werden.

von Ralf (Gast)


Lesenswert?

> Genau. Macht beim Debuggen dann auch "interessante" Effekte, weil der
> Compiler beim Optimieren gern Code-Blöcke umarrangiert. Trotzdem besser
> als ohne Debuginfos.
Oh ja, das hab ich bei den µC-Compilern schon erlebt, dass die 
Release-Variante mit voller Optimierung etwas so verbogen hat das nix 
mehr lief :)

> Nix, der Kunde soll ja nicht debuggen und bekommt die Debuginfos auch
> nicht mitgeliefert.
> ...
> Es geht einfach darum dass man das an den Kunden gegebene Binary (eine
> garantiert bitgenaue Kopie) selber debuggen kann falls schwierige
> Probleme nachvollzogen werden müssen, das muss also aufgehoben werden.
Da stimme ich dir zu, die Kopie mit Debug-Infos macht Sinn.
Aber in dem Zusammenhang würde mich interessieren, wie man dann vorgeht 
wenn man das Problem nicht am Entwicklungsrechner nachvollziehen kann, 
da das Problem vielleicht lokal auf den Kunden beschränkt ist.
Gibts da ne Möglichkeit trotzdem an die Debugausgaben o.ä. ranzukommen? 
Ansonsten würd ich mir ne eigene Debugklasse schreiben, welche anstatt 
der Debugkonsole eine TXT-Datei o.ä. für die Ausgaben verwendet.
Ein-/Ausschalten kann man die Ausgaben ja dann über einen versteckten 
Switch oder so.

Ralf

von Jasch (Gast)


Lesenswert?

Ralf schrieb:
>> Genau. Macht beim Debuggen dann auch "interessante" Effekte, weil der
>> Compiler beim Optimieren gern Code-Blöcke umarrangiert. Trotzdem besser
>> als ohne Debuginfos.
> Oh ja, das hab ich bei den µC-Compilern schon erlebt, dass die
> Release-Variante mit voller Optimierung etwas so verbogen hat das nix
> mehr lief :)
>
>> Nix, der Kunde soll ja nicht debuggen und bekommt die Debuginfos auch
>> nicht mitgeliefert.
>> ...
>> Es geht einfach darum dass man das an den Kunden gegebene Binary (eine
>> garantiert bitgenaue Kopie) selber debuggen kann falls schwierige
>> Probleme nachvollzogen werden müssen, das muss also aufgehoben werden.
> Da stimme ich dir zu, die Kopie mit Debug-Infos macht Sinn.
> Aber in dem Zusammenhang würde mich interessieren, wie man dann vorgeht
> wenn man das Problem nicht am Entwicklungsrechner nachvollziehen kann,
> da das Problem vielleicht lokal auf den Kunden beschränkt ist.

Dann hat man in jedem Fall ein größeres Problem am Hals... ;-)

> Gibts da ne Möglichkeit trotzdem an die Debugausgaben o.ä. ranzukommen?
> Ansonsten würd ich mir ne eigene Debugklasse schreiben, welche anstatt
> der Debugkonsole eine TXT-Datei o.ä. für die Ausgaben verwendet.
> Ein-/Ausschalten kann man die Ausgaben ja dann über einen versteckten
> Switch oder so.

Wenn ich davon ausgehe dass Du .NET (C#, VB.NET, ...) benutzt ist in 
jedem Fall "Log4net" das Mittel der Wahl. Gibt es wohl auch für C++, 
habe ich aber noch nichts damit gemacht.

Da sind solche Features halt schon drin, haben ja auch andere Leute 
dieselben Probleme.

von Ralf (Gast)


Lesenswert?

> Dann hat man in jedem Fall ein größeres Problem am Hals... ;-)
grins =) Wenn's einfach wär, könnt's jeder XD

> Wenn ich davon ausgehe dass Du .NET (C#, VB.NET, ...) benutzt ...
Korrekt.

> ...ist in jedem Fall "Log4net" das Mittel der Wahl. Gibt es wohl auch für
> C++, habe ich aber noch nichts damit gemacht.
Log4Net hört sich gut an, nachdem was ich beim Überfliegen gelesen habe 
-> besten Dank für den Tip.

Ralf

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.