stdout.txt - Erklärung & typische Fehlermeldungen

Willkommen in der Transport Fever Community

Wir begrüßen euch in der Fan-Community zu den Spielen Transport Fever und Train Fever, den Wirtschaftssimulatoren von Urban Games. Die Community steht euch kostenlos zur Verfügung damit ihr euch über das Spiel austauschen und informieren könnt. Wir pflegen hier einen freundlichen und sachlichen Umgang untereinander und unser Team steht euch in allen Fragen gerne beiseite.

 

Die Registrierung und Nutzung ist selbstverständlich kostenlos.

 

Wir wünschen euch viel Spaß und hoffen auf rege Beteiligung.

Das Team der Transport-Fever Community


  • Um das Mysterium "stdout.txt" ein bisschen verständlicher zu machen und die Kompetenz der gesamten Community möglichst vielen zugänglich zu machen, habe ich diesen Eintrag erstellt.

    Diese Datei wird ein lebendes Dokument sein, in das typische Fehlermeldungen eingetragen und deren Bedeutung erklärt werden kann - ich bitte euch darum, alle mitzumachen.

    Vielleicht noch ein passendes Zitat von VacuumTube zur Einleitung:

    Zitat von @VacuumTube

    Die stdout ist eine ungeordnete Sammlung von Logmeldungen (ohne Zeitstempel), die sowohl vom Spiel als auch von einzelnen Mods kommen.

    Es gibt nicht den einen Weg, eine stdout richtig zu lesen. Je nach Problem, muss man sich das genau anschauen. Erst wenn man sich schon länger damit beschäftigt hat, versteht man den prinzipiellen Aufbau und die Bedeutung der Meldungen.

    Danto Danke für das Erstellen. Ich hab den Artikel mal erweitert und unten die Liste angefangen, wie ich mir das etwa vorgestellt habe.

    1 Einleitung

    Dieser Lexikon-Artikel soll den Umgang mit Crashes/Fehlermeldungen vereinfachen. Bei der Fehlersuche geht es meist darum, die verantwortliche Mod zu finden. Dieser Artikel soll helfen, die Fehlerart und die Ursache anhand der stdout.txt festzustellen, welche für weniger erfahrene Spieler offenbar nur schwer zu durchschauen ist. Außerdem sollen in einer Liste (unten) bekannte Fehlermeldungen mit Erläuterung festgehalten werden. Diese ist auch für Modder bei der Fehlersuche interessant.


    Dies soll aber keine Schritt-für-Schritt Anleitung sein, denn in vielen Fällen muss man einfach genauer hinschauen oder ist auf die Erfahrung der Modder hier im Forum angewiesen. Daher gilt, wenn euch die Informationen hier und die Fehlerliste nicht weiterhelfen: Schreibt euer Problem ins Forum. Achtet dabei darauf, genau zu beschreiben, wann/wie der Fehler auftritt und welche Mods ihr benutzt. Das wichtigste: immer die stdout.txt anhängen, denn manchmal stehen auch vor der eigentlich Fehlermeldung entscheidende Informationen.

    2 Allgemeines

    • Grundlagen/Speicherorte: Speicherorte der Spieldateien, stdout.txt, Speicherstände, Mods
    • Die Datei wird mit jedem neuen Spielstart überschrieben
    • Im selben Ordner befinden sich auch die Minidumps (.dmp) - diese können aber nur Urban Games lesen, wir können damit nichts anfangen
    • Lest die stdout.txt am besten immer von unten nach oben - tendenziell steht unten das, was euer Spiel zum Absturz gebracht hat
    • Die Zeilen kurz vor der Fehlermeldung können relevant sein, müssen aber nicht (siehe gewöhnliche Meldungen)
    • Man sollte nicht anfangen, die stdout zu überinterpretieren. Am Ende stehen dort nur begrenzte Informationen, ggf. von Mods direkt, aber nur wenn sich der Modder entscheidet eine Information via print(...) zu loggen. D.h. oft sind die Informationen die dort stehen nicht ausreichend. Nur weil 2 Zeilen untereinander stehen, heißt es nicht, dass es einen Zusammenhang gibt. Denkt daran, dass es keine Zeitstempel gibt. Die nächste Zeile wurde ggf. 30min später geschrieben. Evtl. macht es daher Sinn, das Log mithilfe der Konsole während des Spiels zu beobachten.

    3 Arten von Crashes

    Ich unterscheide mal 3 grundlegende Möglichkeiten, wie das Spiel crashen kann.

    Ihr solltet nach einem Crash mit der Fehlermeldung schnell merken, um was es sich handelt, somit lässt sich das Problem eingrenzen.

    • Lua Fehler: Tritt auf, wenn im Lua-Code eine nicht-geschützte Exception auftritt, z.B. ein Null-Pointer-Fehler wegen fehlender Überprüfung. Die Ursache ist meistens ein Mod. Diese Fehler sind leicht zu analysieren, weil direkt die Fehlerzeilen in den Lua Dateien angegeben sind. z.B.: stack traceback: error: .../local/mods/modxy_1/mod.lua:36: attempt to index global 'var1' (a nil value)
    • Assertion: Diese "Tests" sind von den Entwicklern in den Quellcode eingebaut, um fehlerhaftes Verhalten oder ungültige Zustände zu erkennen. Die eigentliche Ursache kann jedoch sehr viel früher entstehen. Grundsätzlich ist es ein Fehler im Spiel, aber auch Mods können verantwortlich sein. Das Spiel bricht sofort ab, um Folgefehler oder korrupte Savegames zu vermeiden.
      Im Log wird zusätzlich zur fehlgeschlagenen Assertion die Quelldatei und Zeile sowie die Funktion, in der der Fehler auftrat, angegeben. Wir können das nicht nachsehen, da der C++ Quellcode nicht öffentlich ist, aber man kann oft spekulieren, was das Problem sein könnte. Außerdem findet ihr in alten Threads oder in der Liste (unten) mehr Informationen, falls der Fehler bekannt ist.
    • Andere: Leider passiert es auch manchmal, dass das Spiel ohne irgendeine Art von Fehlermeldung abstürzt. Erscheint "An error just occurred" oder "heap corruption" beendet das Spiel durch einen unerwarteten Fehler sofort, weil ein ungültiger Speicherzugriff/zustand erkannt wurde. Die Ursache ist dann sehr tief im Spiel selbst. Oder aber das Programm wird von außen gekillt (ist zB der Fall, wenn es nicht reagiert und man es zum Abbruch zwingt). In der stdout ist dann die letzte Zeile "normal" und jede Art von Fehlermeldung oder Goodbye fehlt, außerdem gibt es kein Minidump. Die Ursache ist nur schwer rauszufinden. Auch Hardwareprobleme sind möglich.

    4 Typische stdout-Meldungen ohne Absturz

    Hier können wir "gewöhnliche" Meldungen sammeln, die zwar anzeigen, dass etwas nicht in Ordnung ist, aber in der Regel nicht der Grund für einen Crash sind.

    • texture load error: Eine Textur kann nicht geladen werden. Im Spiel macht sich das durch eine lila Fläche bemerkbar, führt aber nicht zum Absturz
    • error loading dds file: Eine dds Datei kann nicht geladen werden
    • vehicle/x.mdl is missing boundingInfo: Im Modell ist keine boundingInfo angegeben
    • * x.mdl was removed because the following resources were missing: Fehlende Modelle werden durch Dummys ersetzt
    • [RESOURCE ERROR] Referenced model not found: 'x.mdl' in 'x.lua' (has been replaced with fallback): Fehlende Spieldaten
    • WARNING: alutCreateBufferFromFile failed for "x.wav": Zuviele Soundquellen, Sound wird nicht abgespielt
    • [ModUtil|UserSettings] Previous settings for id "x" are overwritten: Doppelte id beim Modutil -> Mod doppelt geladen?

    5 Fehlermeldungen Liste

    Hier sollen alle bekannten Assertion-Fehlermeldungen inklusive vermutlicher Ursache gesammelt werden. Dies ermöglicht außerdem einen gewissen Einblick in den Aufbau und die Programmierung des Spiels.

    Der Aufbau ist immer gleich. Die Datei im Quellcode, in der der Fehler auftritt, beginnt mit c:\build\tpf2_steam oder c:\build\tpf2_gog bzw. seit neustem mit C:\GitLab-Runner\builds\...\ug\urban_games\train_fever\, deshalb wird das weggelassen.

    Im wiki gibt es eine ähnliche Fehlerliste. Diese ist aber unvollständig und teilweise unklar.


    Beachtet auch, dass zur selben Assertion verschiedene Ursachen führen können. Auch sind viele Assertions unbekannt oder nicht aussagekräftig.

    Die Liste darf gerne von jedem, der neue Erkenntnisse hat, erweitert werden. Bei Unsicherheiten bitte Kommentar schreiben.


    Quelldatei/zeileError message / Assertion ... failedvermutliche Ursache/ProblemlösungFunktion
    Error message: cannot open .../mod.lua: No such file or directoryKann auftreten, wenn Dateien einer Workshop Mod nicht gefunden werden. Ggf neu abbonieren oder Steam neustarten.
    \src\lib\model\io\converter_model.h:179invalid material type: REFLECTIVE_NRML_MAP_OPUngültiger Materialtyp.
    TPF1 Mod?
    enum MaterialType __cdecl Converter<enum MaterialType,void>::operator ()(const class std::variant<struct lua::Nil,bool,double,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,struct lua::Table> &)
    \src\lib\util\idrep.h:84falseBeschädigte Datei: Spieldatein mit Steam überprüfen.
    1
    int __cdecl IdRep<class Model *>::GetId(const class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > &) const
    \src\game\terrain\renderdatamanager.cpp:806m_subscriptions.empty()Tritt manchmal als Folge eines anderen Fehlers auf.
    Shader Enhancement ?
    __cdecl terrain::RenderDataManager::~RenderDataManager(void)
    \src\Game\Terrain\render_data\MaterialData.cpp:46detailTextures.size() < 255Im Spiel können höchstens 254 Bodentexturen geladen werden. Zuviele Mods mit Bodentexturen aktiviert.__cdecl terrain::MaterialData::MaterialData(class IRenderContext &,const class FileSystem &,const class terrain::MaterialTypeRep &,class IProgressMonitor &)
    \src\game\application.cpp:637false / Out of memoryZu wenig RAM vorhanden oder anderer Fehler. Tritt auf, wenn die Karte zu groß ist und/oder die Auslagerungsdatei zu klein.void __cdecl Main(int,char *[])
    \src\lib\renderer\tex_load.cpp:343img.width % 2 == 0 && img.height % 2 == 0Eine Textur hat eine ungültige Größestruct Rgbe::CImage __cdecl `anonymous-namespace'::ScaleDown(const struct Rgbe::CImage &)
    \src\lib\renderer\tex_load.cpp:528numBits == 8 | | numBits == 16 | | numBits == 24 | | numBits == 32 | | numBits == 64Eine Textur hat eine ungültige Größeint __cdecl `anonymous-namespace'::CompInternalSize(unsigned int,int,int,int,int)
    \src\lib\renderer\tex_load.cpp:821redGreen == (format.Internal == gli::gl::INTERNAL_RG_ATI2N_UNORM)Eine Textur hat ein ungültiges Formatint __cdecl `anonymous-namespace'::UploadTexture(const class gli::texture &,unsigned int,bool)
    \src\lib\renderer\texturemanager.cpp:105it != m_textures.end()void __cdecl TextureManager::RemoveRef(const struct engine::TextureDesc &)
    \src\Lib\renderer\model\DynamicModelRenderer.cpp:215mesh->groups.size() == materials.size()Fehlerhaftes Modell
    1
    void __cdecl DynamicModelRenderer::Add(int,const class std::vector<int,class std::allocator<int> > &,const struct CMat4f *,int,const struct Box3 &,const int *,int,const float *,int)
    \src\lib\renderer\model\staticbuffer.cpp:507vbo > 0Fehler mit Materialien?
    Signale?
    auto __cdecl StaticBuffer::Render::<lambda_....>::operator ()(const struct VertexAttr &) const
    \src\lib\renderer\model\vaomanager.cpp:112m_meshes->Get(meshId)->va2vertexAttr[va.index].numComp == va.size * va.arrSize?unsigned int __cdecl VaoManager::Get(const class ITechnique *,int,int)
    \src\lib\model\edge_geometry_util.cpp:123result.length > .0fStraßen/Schienen-Bau nicht möglich.
    (zB wenn maxSlope 0 ist)
    struct transport::EdgeGeometry __cdecl transport::MakeSplineEdge(const struct CVec3f &,const struct CVec3f &,const struct CVec3f &,const struct CVec3f &,float)
    \src\lib\model\edge_geometry_util.h:215len > .0fUngültige Straßenlänge
    1
    void __cdecl transport::VisitEdge<class transport::`anonymous-namespace'::CalcMaxCurvatureStep::<lambda_....>>(const struct transport::EdgeGeometry &,bool,float,float,float,float,int,class transport::`anonymous-namespace'::CalcMaxCurvatureStep::<lambda_...>)
    \src\lib\model\edge_geometry_util.cpp:216false
    CVec3f transport::CalcPosition(const transport::EdgeGeometry&, float, CVec3f*, CVec3f*)
    \src\lib\ui\combobox.cpp:174index < (int)m_createItemFns.size()Möglicher Fehler, wenn 2 Comboboxen denselben Parameter key habenvoid __cdecl UI::ComboBox::SetSelected(int,bool)
    \src\lib\ui\core.cpp:1446pr.second && "Duplicate id found."ID eines Gui Elements doppelt vorhanden.
    In der vorigen Zeile sollte die ID stehen.
    Mod doppelt geladen?
    void __cdecl UI::CCore::AddId(class UI::ILayoutItem *)
    \src\Lib\Geometry\Streets\Transitions\transition_util.cpp:125angle >= .0f && angle <= Math::PIKann Auftreten beim Bearbeiten einer Konstruktion mit fehlerhaft definierten Straßenfloat __cdecl StreetGeometry::TransitionUtil::CompCurveHandleDistance(float,float)
    \src\Game\construction\apply_proposal.cpp:440proposalData.errorState.Empty() | | g_allowApplyWithErrorsHackEine Stadt hat Probleme beim Ausbreiten. Hindernisse in unmittelbarer Nähe des Stadtmittelpunktes sollten vermieden werden!
    Es kann auch eine Industrie sein, die gerade upgraden will.
    class std::vector<class ecs::Entity,class std::allocator<class ecs::Entity> > __cdecl construction_builder_util::Apply(class ecs::Engine &,const struct street_util::StreetToolkit &,struct construction_builder_util::ProposalData &)
    \src\game\construction\make_proposal.cpp:692(int)construction.stocks.size() == (int)r.size()Fehler bei der Angabe der cargo rule void __cdecl construction_builder_util::MakeProposalAdd(...const struct Construction &,const struct CMat4f &,const class std::unordered_map<int,struct std::pair<class ecs::Entity,float>,struct std::hash<int>,struct std::equal_to<int>,class std::allocator<struct std::pair<int const ,struct std::pair<class ecs::Entity,float> > > > ....
    \src\Game\construction\street\ProposalStreetGraph.cpp:54!Contains(m_proposal->removedNodes, entity)Fehler bei Straßenbau?const struct ecs::component::BaseNode &__cdecl street_util::ProposalStreetGraph::GetNode(const class ecs::Entity &) const
    \src\game\init_game_util.cpp:206con.simBuildings.size() == 1Tritt beim Erstellen einer neuen Karte auf, wenn eine Industry unvollständige Daten in der updateFn zurückgibt. (Die params sind hier ggf nil)class std::vector<class ecs::Entity,class std::allocator<class ecs::Entity> > __cdecl init_game_util::BuildIndustries(class ecs::Engine &,const struct street_util::StreetToolkit &,const class ConstructionRep *,const class CostRep *,const class ecs::NameSystem *,const struct init_game_util::IndustryResults &,class IProgressMonitor &)
    \src\game\procedural\buildingtyperep.cpp:66falseEs sind keine Stadtgebäude für die Stadterweiterung verfügbarclass std::vector<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > __cdecl `anonymous-namespace'::GetCandidates(const class BuildingTypeRep &,const class ConstructionRep &,enum LandUseType,int,int)
    \src\game\procedural\buildingtyperep.cpp:373it != m_buildingTypes.end()Kann beim Klick auf das Landnutzungslayer auftreten, wenn unerwartete Gebäude vorhanden sindconst struct BuildingType &__cdecl BuildingTypeRep::GetType(const class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > &) const
    \src\game\procedural\trackgenerator.cpp:120(int)trackType.trackStraightModel.size() == 4Gleisdatei ungültigclass std::set<int,struct std::less<int>,class std::allocator<int> > __cdecl TrackGenerator::GetModelIds(const struct procedural::Shape &) const
    \src\game\terrain\groundtexturerep.cpp:131falseNicht vorhandene ground_textureconst struct GroundTexture &__cdecl GroundTextureRep::Get(const class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > &) const
    \src\game\transport\street\streetshapefactory.cpp:931Valid(result.laneConfigs)transportModesStreet einer Straße ungültigc:\build\tpf2_steam\src\game\transport\street\streetshapefactory.cpp:931: struct StreetGeometry::StreetContext __cdecl CreateStreetContext(const struct StreetType &,int,bool,bool,bool,bool)
    \src\game\transport\street\streettyperep.cpp:226falseNicht vorhandener Straßentypint __cdecl StreetTypeRep::GetIndexExact(const class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > &) const
    \src\game\transport\cargotyperep.cpp:117int(index) >= 0Ungültiger Gütertypstruct CargoTypeId __cdecl transport::CargoTypeRep::GetIndex(const class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > &) const
    \src\game\transport\vehicle_cargo_util.cpp:160it != format2model.end()Problem mit Cargo-Mod/CargoTypeclass std::_List_const_iterator<class std::_List_val ...
    \src\game\transport\path_util.cpp:174dist < .0fProblem bei Pfadfindung
    (zB wenn Flugzeug zu hoch ist)
    struct transport::PathPos __cdecl transport::Move<struct std::pair<struct transport::EdgeGeometry,bool>>(const class ecs::Engine *,int,const class transport::TpNetData &,const class std::vector<struct std::pair<struct transport::EdgeGeometry,bool>,class std::allocator<struct std::pair<struct transport::EdgeGeometry,bool> > > &,struct transport::PathPos,float)
    \src\Game\transport\vehicle_util_3.cpp:840nextEdgeId.entity == edgeEntityKann bei komplexen Station in Verbindung mit dem Straßennetz auftreten, z.B. hugedragonyk_uep2_40d_international_port
    1 2
    void __cdecl vehicle_util::MotionCalculator::GetNextSpeedLimitAndVehicles(const struct vehicle_util::CalcInput &,class std::array<struct BrakePoint,7> &,struct ecs::component::RoadVehicle::DynState &)
    \src\game\urbansim\pathfinder_util.cpp:365itCache != m_station2stationsAndDistances.end()Problem bei Pfadfindung
    (evtl Abstand zwischen Stationen zu groß)
    void __cdecl simulation_util::path_finder::`anonymous-namespace'::LinesExpander::VisitLinesAll(const class ecs::Entity &,class transport::PathFinder<struct transport::LineSectionOptimized,class transport::ZeroHeuristic> &,int,float) const
    \src\game\urbansim\parcel_util.cpp:1153face[0] != face[1]Beschädigtes Gebäude.
    In der vorigen Zeile sollten Koordinaten stehen.
    class ecs::Entity __cdecl parcel_util::CreateBuilding(const struct parcel_util::BuildingDesc &,class ecs::Engine &,const struct street_util::StreetToolkit &,const struct parcel_util::ParcelContext &,class boost::random::mersenne_twister_engine<unsigned int,....> &,class std::vector<class ecs::Entity,class std::allocator<class ecs::Entity> >,bool)
    \src\game\ui\components\addmodulecomp.cpp:299it.secondEin Problem mit modularer Station__cdecl UI::AddModuleComp::AddModuleComp(class CommandList &,const class GameRes &,class UI::IGameStateProvider &,class UI::GameTimeUI &,class UI::ModuleBuilder *,class std::shared_ptr<class UI::RendererFactory>,class UI::MenuCategorySettings,class UI::CRendererComponent &,class UI::Window *)
    \src\game\ui\util\consumersupplierdataprovider.cpp:112it != result.end()Passiert beim Klicken auf Abnehmer einer Industrie, wenn keine echten Industrien (type=Industry) die Abnehmer sindclass std::unordered_map<class ecs::Entity,struct `anonymous namespace'::CargoFlowData,struct std::hash<class ecs::Entity>,.... __cdecl `anonymous-namespace'::GetConsumerData(const class ecs::Engine &,const class ecs::TownBuildingSystem &,const class ecs::SimBuildingSystem &,....
    \src\lib\ecs\engine.h:275it != components.end()Das Spiel ist nach dem Entity Component System (ECS) aufgebaut. Diese Meldung bedeutet, dass einer Entity eine Component fehlt, welche offenbar erwartet wird. Diese Daten sind also fehlerhaft im Spielstand abgespeichert. Deaktivieren von Mods hilft also nichts. Seit einem Update gibt das Spiel zumindest die betroffene Entity Id und die Art der Component an, was die Fehlersuche einschränkt.int __cdecl ecs::Engine::GetComponentDataIndex(const class ecs::Entity &,int) const
    \src\Lib\ecs\Engine.cpp:660!m_notificationInProcessDEBUGTritt manchmal als Folge eines anderen Fehlers aufvoid __cdecl ecs::Engine::EndModification(void)
    \src\game\ecs\trainmovesystem.cpp:666mp.speed >= .0f
    auto __cdecl ecs::TrainMoveSystem::Update2::<lambda_...>::operator ()(int,int) const
    \src\Game\ecs\SimPersonAtVehicleSystem.cpp:97spav.place >= 0 && spav.place < (int)vehiclePartInfo.seats.size()Ein Fahrzeug hat ungültige Anzahl von Sitzplätzenvoid __cdecl ecs::SimPersonAtVehicleSystem::EntityAdded(class ecs::Engine *,const class ecs::Entity &)
    \src\Game\ecs\AircraftMoveSystem.cpp:738mp.aircraftState.flightState == component::MovePathAircraft::AircraftState::LANDINGKann auftreten wenn man einen anderen Spielstand lädt und nicht alle Flugzeug Mods hat, welche dann durch Platzhalter ersetzt werden. Am besten Spiel im Pausenmodus lassen, und betroffene Flugzeuge ersetzen.void __cdecl ecs::AircraftMoveSystem::Update2(class ecs::Engine *,int,float)
    \src\game\ecs\simpersonsystem.cpp:1823fromEdgesDrive.empty() | | !toEdgesDrive.empty()?void __cdecl ecs::SimPersonSimEntityIdle(class ecs::Engine *,const class ecs::Entity &,const class std::vector<struct transport::EdgePos,class std::allocator<struct transport::EdgePos> > &,const class std::vector<struct transport::EdgePos,class std::allocator<struct transport::EdgePos> > &,const struct transport::LineOrEdges &,const class std::vector<struct transport::EdgePos,class std::allocator<struct transport::EdgePos> > &,const class std::vector<struct transport::EdgePos,class std::allocator<struct transport::EdgePos> > &,struct CargoTypeId)
    \src\Game\Game.cpp:349m_data->gameStates[1]->ScriptSave() == m_data->gameStates[0]->ScriptSave()gamescript Problematikvoid __cdecl CGame::StartGameSim(void)
    it->second.second == 1in den edgeLists (Straße oder Schiene) ist einer der snapNodes nicht korrekt (z.B. nicht am Endstück der Straße)



    Die Funktion ist jetzt rechts (4. Spalte) und hat die kleinste Schriftgröße mit Tahoma, um nicht so viel Platz wegzunehmen. Spoiler wäre perfekt, aber innerhalb einer Tabelle leider nicht möglich.

Teilen

Kommentare 4

  • Test: ||

    Traurig 1
    • Ok, keine Ahnung aber offensichtlich führt " | | " zu einem müden Smiley

  • Das ist genau das, was ich haben wollte :)

    Gefällt mir 1
  • Wow, @VacuumTube, das ist wirklich toll geworden - danke dir vielmals! :)

    Gefällt mir 1