Fehlersuche in QML-Anwendungen

Wenn Sie eine Anwendung mit QML entwickeln, gibt es viele Möglichkeiten, mögliche Probleme zu debuggen, auf die Sie stoßen könnten. Die folgenden Abschnitte beschreiben die verfügbaren Debugging-Tools und ihre Verwendung.

Konsolen-API

FunktionBeschreibung
ProtokollVerwenden Sie console.log, console.debug, console.info, console.warn, oder console.error, um Debugging-Informationen auf der Konsole zu drucken.

Zum Beispiel:

function f(a, b) {
  console.log("a is ", a, "b is ", b);
}

Die Ausgabe wird mit den Methoden qCDebug, qCWarning oder qCCritical in C++ generiert, mit einer Kategorie von qml oder js, je nach dem Typ der Datei, die die Protokollierung vornimmt. Siehe auch Debugging-Techniken.

Assertconsole.assert testet, ob ein Ausdruck wahr ist. Ist dies nicht der Fall, wird eine optionale Meldung auf die Konsole geschrieben und der Stack-Trace ausgedruckt.

Zum Beispiel:

function f() {
  var x = 12
  console.assert(x == 12, "This will pass");
  console.assert(x > 12, "This will fail");
}
Die Zeitgeberconsole.time und console.timeEnd protokollieren die Zeit (in Millisekunden), die zwischen den Aufrufen verbracht wurde. Beide nehmen ein String-Argument, das die Messung identifiziert.

Zum Beispiel:

function f() {
    console.time("wholeFunction");
    console.time("firstPart");
    // first part
    console.timeEnd("firstPart");
    // second part
    console.timeEnd("wholeFunction");
}
Traceconsole.trace gibt den Stack-Trace der JavaScript-Ausführung an der Stelle aus, an der sie aufgerufen wurde. Diese Stack-Trace-Informationen enthalten den Funktionsnamen, den Dateinamen, die Zeilennummer und die Spaltennummer. Der Stack-Trace ist auf die letzten 10 Stack-Frames beschränkt.
Zählenconsole.count gibt die aktuelle Anzahl der Ausführungen eines bestimmten Codes zusammen mit einer Meldung aus.

Zum Beispiel:

function f() {
  console.count("f called");
}

Das obige Codebeispiel gibt f called: 1, f called: 2... aus, wenn f() ausgeführt wird.

Profilconsole.profile schaltet die QML- und JavaScript-Profiler ein. Verschachtelte Aufrufe werden nicht unterstützt und es wird eine Warnung auf der Konsole ausgegeben.
ProfilEndeconsole.profileEnd schaltet die QML- und JavaScript-Profiler aus. Beim Aufruf dieser Funktion ohne vorherigen Aufruf von console.profile wird eine Warnung auf der Konsole ausgegeben. Vor diesem Aufruf muss ein Profiling-Client angeschlossen werden, um die Profildaten zu empfangen und zu speichern.

Zum Beispiel:

function f() {
    console.profile();
    //Call some function that needs to be profiled.
    //Ensure that a client is attached before ending
    //the profiling session.
    console.profileEnd();
}
Exceptionconsole.exception gibt eine Fehlermeldung zusammen mit dem Stack-Trace der JavaScript-Ausführung an dem Punkt aus, an dem sie aufgerufen wird.

Alternativ kann auch eine logging category als erstes Argument an eine dieser Funktionen console übergeben werden. Siehe LoggingCategory für weitere Einzelheiten.

Debuggen von Modulimporten

Setzen Sie die Umgebungsvariable QML_IMPORT_TRACE, um die Debug-Ausgabe von QMLs Import-Lademechanismen zu aktivieren.

Zum Beispiel für eine einfache QML-Datei wie diese:

import QtQuick

Rectangle { width: 100; height: 100 }

Wenn Sie QML_IMPORT_TRACE=1 setzen, bevor Sie das QML Runtime Tool oder Ihre QML C++ Anwendung ausführen, werden Sie eine Ausgabe ähnlich der folgenden sehen:

QQmlImportDatabase::addImportPath "/qt-sdk/imports"
QQmlImportDatabase::addImportPath "/qt-sdk/bin/QMLViewer.app/Contents/MacOS"
QQmlImportDatabase::addToImport 0x106237370 "." -1.-1 File as ""
QQmlImportDatabase::addToImport 0x106237370 "Qt" 4.7 Library as ""
QQmlImportDatabase::resolveType "Rectangle" = "QDeclarativeRectangle"

QML-Debugging-Infrastruktur

Das Qt Qml Modul bietet Dienste zum Debuggen, Überprüfen und Profilieren von Anwendungen über einen TCP-Port oder einen lokalen Socket.

Hinweis: Die qmltooling Plugins, die für das Debuggen und Profiling von QML-Anwendungen auf Geräten erforderlich sind, werden bei der Qt-Installation automatisch installiert. Sie müssen auf den Geräten bereitgestellt werden, damit Debugging und Profilerstellung funktionieren.

Aktivieren der Infrastruktur

Wenn Sie Ihre Anwendung kompilieren, müssen Sie die Debugging-Infrastruktur explizit aktivieren. Wenn Sie qmake verwenden, können Sie die Konfigurationsparameter in die Projektdatei .pro einfügen:

  • Qt Quick 1: CONFIG+=declarative_debug
  • Qt Quick 2: CONFIG+=qml_debug

Wenn Sie ein anderes Build-System verwenden, können Sie die folgenden Defines an den Compiler übergeben:

  • Qt Quick 1: QT_DECLARATIVE_DEBUG
  • Qt Quick 2: QT_QML_DEBUG

Hinweis: Die Aktivierung der Debugging-Infrastruktur kann die Integrität Ihrer Anwendung und Ihres Systems gefährden, weshalb Sie sie nur in einer kontrollierten Umgebung aktivieren sollten. Wenn die Infrastruktur aktiviert ist, zeigt die Anwendung die folgende Warnung an:

QML debugging is enabled. Only use this in a safe environment.

Starten von Anwendungen

Um das Debugging zu aktivieren - von Anfang an oder um später einen Debugger anzuschließen - starten Sie die Anwendung mit den folgenden Argumenten:

-qmljsdebugger=port:<port_from>[,port_to][,host:<ip address>][,block][,file:<local socket>][,services:<comma-separated list of services to enable>]

Wobei:

  • Das obligatorische port_from gibt entweder den Debugging-Port oder den Startport eines Portbereichs an, wenn port_to angegeben ist.
  • die optionale ip address gibt die IP-Adresse des Rechners an, auf dem die Anwendung läuft
  • die optionale Angabe block verhindert, dass die Anwendung ausgeführt wird, bis der Debug-Client eine Verbindung zum Server herstellt
  • die optionale file spezifiziert den lokalen Socket.
  • die optionale services gibt die zu aktivierenden Dienste an; die Voreinstellung ist, dass alle gefundenen Dienste aktiviert werden. Beachten Sie, dass der Dienst v4 debug das JIT deaktiviert.

Nachdem die Anwendung erfolgreich gestartet wurde, wird die folgende Meldung angezeigt:

QML Debugger: Waiting for connection on port <port_number> oder QML Debugger: Connecting to socket at <file>"

Verbinden mit Anwendungen

Wenn die Anwendung läuft, kann sich eine IDE oder ein Tool, das das Binärprotokoll implementiert, mit dem offenen Port verbinden.

Qt stellt ein qmlprofiler Kommandozeilen-Tool zur Verfügung, um Profiling-Daten in einer Datei zu erfassen. Um dieses Tool zu starten, geben Sie den folgenden Befehl ein:

qmlprofiler -p <port> -attach <ip address>

Debuggen mit Qt Creator

Qt Creator verwendet die Debugging-Infrastruktur zum Debuggen, Untersuchen und Erstellen von Profilen von Qt Quick -Anwendungen auf dem Desktop und auf entfernten Geräten. Qt Creator bietet integrierte Clients zum Debuggen von JavaScript, zum Untersuchen des Objektbaums und zum Erstellen von Profilen der Aktivitäten einer QML-Engine. Weitere Informationen finden Sie unter Qt Creator: Debugging Qt Quick Projekte.

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.