Bräutigam, K. (2015). Expedient logging for C++ using reflection [Diploma Thesis, Technische Universität Wien]. reposiTUm. https://doi.org/10.34726/hss.2015.27707
Seit den Anfängen der Programmierung erschwert die verborgene Ausführung von Programmen in miniaturisierten Recheneinheiten die Nachvollziehbarkeit durch den Menschen. Wachsende Größenordnungen und Komplexität von Applikationen, welche immer verteilter und nebenläufiger operieren erfordern immer mächtigere und fortschrittlichere Programmiersprachen und Konzepte wie Reflection. Logging bzw. Tracing entwickelte sich früh zu einem wichtigen Instrument, um mit Hilfe spezieller Werkzeuge relevante Informationen während der Programmausführung in menschenlesbarer Form zu extrahieren und hat bis heute große Bedeutung. Diese Arbeit beweist, dass die Erweiterung traditioneller Logging-Mechanismen für C++ mit Hilfe von Reflection machbar ist. C++ unterstützt Reflection nicht in ausreichender Form, wodurch der Einsatz externer Frameworks unumgänglich ist. Die Arbeit beginnt mit allgemeinen Studien über Reflection, sowie die notwendigen Logging Grundlagen und Funktionen inklusive relevanter wissenschaftlicher Publikationen. Der nachfolgende Teil beschäftigt sich mit der Analyse und Evaluierung bereits verfügbarer C++ Werkzeuge für Reflection und informiert über Funktionen und daraus resultierende Einsatzmöglichkeiten. Im Weiteren wird ein architekturelles Design vorgestellt, welches Logging Funktionalitäten auf Basis von Reflection bietet. Darauffolgend wird eine Implementierung in Form eines Prototyps präsentiert und die wichtigsten Charakteristika beschrieben. Eine Evaluierung der Laufzeiteigenschaften für die gezeigte Lösung und Vorschläge für zukünftige wissenschaftliche Arbeiten runden die Arbeit ab. Den Abschluss bildet eine Zusammenfassung der gewonnenen Erkenntnisse.
de
From the very beginning of programming, the invisibility of software processing hindered effective interaction with human beings. Rising scale and complexity of increasingly parallelized and distributed applications demanded advanced programming languages and additionally progressive programming concepts like reflection. Logging and tracing to selectively reveal information from executed imperative programs with assistance of specialized tools, emerged early and is important till today. The present work is concerned with the research question: Is the development of practically usable logging tools with automatic message scope enrichment and human-readable object serialization possible by using existing approaches to equip C++ with reflective capabilities? Automatic message scope enrichment means that log messages are automatically equipped with extended information. Examples are thread ids during execution or method signatures to reveal the origin of the log statement in the source code. Human-readable object serialization deals with serialization of C++ objects with complex types (classes) during runtime, suitable for debugging tasks and software auditing. Next to pure feasibility of reflective logging for C++ also the introduced resource consumption overhead is focused on. Since C++ does not intrinsically provide sufficient reflective power, use of external frameworks is mandatory. To solve the problem we start with general studies about reflective logging and required features in the context of C++ including related theory and publications. The next part deals with analysis and evaluation of available C++ reflection tools and outlines already existing reflective possibilities. A prototypical implementation is presented and the resulting characteristics are explained. Finally, the solution is evaluated concerning resource consumption and possible extensions for the future are suggested. Evaluation results show that in general powerful reflection can be realised within the natively compiled C++ domain using available reflection tools. Also other mechanisms (e.g. persistence, dependency injection, etc.) beside logging can be realised with the described concepts. The solution reduces source code intrusion and uses reflection also for configuration of the logging tool. This approach supports better convenience for users. Resource consumption overhead for working memory is shown to be not really significant. On the one hand automatic message scope enrichment can be implemented with acceptable run-time performance overhead. On the other hand this kind of overhead is higher for human-readable object serialization limiting its practical use.