GoGPT Best VPN GoSearch

OnWorks-Favicon

perldebug – Online in der Cloud

Führen Sie perldebug im kostenlosen Hosting-Anbieter OnWorks über Ubuntu Online, Fedora Online, den Windows-Online-Emulator oder den MAC OS-Online-Emulator aus

Dies ist der Befehl perldebug, der beim kostenlosen Hosting-Anbieter OnWorks mit einer unserer zahlreichen kostenlosen Online-Workstations wie Ubuntu Online, Fedora Online, dem Windows-Online-Emulator oder dem MAC OS-Online-Emulator ausgeführt werden kann

PROGRAMM:

NAME/FUNKTION


perldebug - Perl-Debugging

BESCHREIBUNG


Haben Sie zunächst versucht, das zu verwenden? -w Schalter?

Wenn Sie mit dem Perl-Debugger noch nicht vertraut sind, lesen Sie vielleicht lieber perldebtut, ein Tutorial
Einführung in den Debugger.

Die Perl Debugger


Wenn Sie Perl mit dem aufrufen -d Wenn Sie den Schalter aktivieren, wird Ihr Skript unter dem Perl-Quelldebugger ausgeführt.
Dies funktioniert wie eine interaktive Perl-Umgebung, die zur Eingabe von Debugger-Befehlen auffordert, die dies ermöglichen
Sie untersuchen den Quellcode, setzen Haltepunkte, rufen Stack-Backtraces ab und ändern die Werte von
Variablen usw. Dies ist so praktisch, dass Sie den Debugger oft ganz von selbst starten
nur um Perl-Konstrukte interaktiv zu testen, um zu sehen, was sie tun. Zum Beispiel:

$ perl -d -e 42

In Perl ist der Debugger kein separates Programm, wie es normalerweise der Fall ist
kompilierte Umgebung. Stattdessen die -d Flag weist den Compiler an, die Quelle einzufügen
Informationen in die Parse-Bäume, die sie an den Interpreter übergeben werden. Das bedeutet
Ihr Code muss zunächst korrekt kompiliert werden, damit der Debugger daran arbeiten kann. Dann, wenn die
Beim Starten des Interpreters lädt er eine spezielle Perl-Bibliotheksdatei vor, die den Debugger enthält.

Das Programm wird angehalten Recht bevor die erste ausführbare Anweisung zur Laufzeit (siehe unten).
bezüglich Anweisungen zur Kompilierungszeit) und fordert Sie auf, einen Debugger-Befehl einzugeben. Gegensätzlich zu
Wie allgemein erwartet, geschieht dies immer, wenn der Debugger anhält und Ihnen eine Codezeile anzeigt
zeigt die Zeile an, um die es sich handelt Über mich auszuführen, und nicht den, den es gerade ausgeführt hat.

Jeder vom Debugger nicht erkannte Befehl wird direkt als Perl-Code ausgeführt („ausgewertet“)
das aktuelle Paket. (Der Debugger verwendet das DB-Paket, um seinen eigenen Status beizubehalten
Information.)

Beachten Sie, dass die genannte „eval“ an einen impliziten Bereich gebunden ist. Infolgedessen alle neu eingeführten
Die lexikalische Variable oder der geänderte Inhalt des Erfassungspuffers geht nach der Auswertung verloren. Der
Debugger ist eine schöne Umgebung zum Erlernen von Perl, aber wenn Sie interaktiv damit experimentieren
Material, das im gleichen Bereich liegen sollte, füllen Sie es in eine Zeile.

Bei jedem an der Debugger-Eingabeaufforderung eingegebenen Text stehen führende und nachfolgende Leerzeichen an erster Stelle
vor der Weiterverarbeitung entlackt. Wenn ein Debugger-Befehl mit einer Funktion in übereinstimmt
Wenn Sie Ihr eigenes Programm verwenden, stellen Sie der Funktion lediglich etwas voran, das nicht wie ein aussieht
Debugger-Befehl, z. B. ein führendes „;“ oder vielleicht ein „+“, oder indem man es mit umschließt
Klammern oder Klammern.

maximal einfach anrufen die Debugger
Es gibt mehrere Möglichkeiten, den Debugger aufzurufen:

perl -d Programmname
Auf dem angegebenen Programm, das durch „Programmname“ identifiziert wird.

perl -d -e 0
Geben Sie interaktiv einen beliebigen „Ausdruck“ mit „-e“ an.

perl -d:ptkdb Programmname
Debuggen Sie ein bestimmtes Programm über die GUI „Devel::ptkdb“.

perl -dt threaded_program_name
Debuggen Sie ein bestimmtes Programm mithilfe von Threads (experimentell).

Debugger Befehle
Der interaktive Debugger versteht die folgenden Befehle:

h Druckt eine zusammenfassende Hilfemeldung aus

h [Befehl] Gibt eine Hilfemeldung für den angegebenen Debugger-Befehl aus.

hh Das spezielle Argument „hh“ erzeugt die gesamte Hilfeseite, was recht ist
lang.

Wenn die Ausgabe des Befehls „hh“ (oder eines anderen Befehls) scrollt
Wenn Sie über Ihren Bildschirm hinausgehen, stellen Sie dem Befehl ein führendes Pipe-Symbol voran, damit er angezeigt wird
laufen Sie durch Ihren Pager, wie in

DB> |hh

Sie können den verwendeten Pager mit dem Befehl „o pager=…“ ändern.

p expr Identisch mit „print {$DB::OUT} expr“ im aktuellen Paket. Insbesondere,
Da dies nur Perls eigene „Druck“-Funktion ist, bedeutet dies, dass verschachtelte Daten vorliegen
Strukturen und Objekte werden im Gegensatz zum „x“-Befehl nicht gedumpt.

Das Dateihandle „DB::OUT“ wird geöffnet /dev/tty, unabhängig davon, wo STDOUT sein kann
weitergeleitet werden.

x [maximale Tiefe] Ausdruck
Wertet seinen Ausdruck im Listenkontext aus und gibt das Ergebnis in einem hübschen Format aus.
gedruckte Mode. Verschachtelte Datenstrukturen werden im Gegensatz dazu rekursiv ausgedruckt
die eigentliche „Drucken“-Funktion in Perl. Wenn Sie Hashes ausgeben, werden Sie das wahrscheinlich tun
bevorzugen Sie 'x \%h' anstelle von 'x %h'. Sehen Sie sich Dumpvalue an, wenn Sie dies tun möchten
dich selber.

Das Ausgabeformat wird durch mehrere unten beschriebene Optionen gesteuert
„Konfigurierbare Optionen“.

Wenn „max Depth“ enthalten ist, muss es eine Zahl sein N; Der Wert wird gelöscht
einzige N Ebenen tief, als ob die Option „dumpDepth“ vorübergehend auf eingestellt worden wäre
N.

V [pkg [vars]]
Zeigt alle (oder einige) Variablen im Paket (standardmäßig „main“) mithilfe von Daten an
Pretty-Printer (Hashes zeigen ihre Schlüssel und Werte, damit Sie sehen, was was ist,
Steuerzeichen werden druckbar gemacht usw.). Stellen Sie sicher, dass Sie das nicht setzen
Geben Sie dort einen Typbezeichner (wie „$“) ein, nur die Symbolnamen, etwa so:

V DB-Dateinamenzeile

Verwenden Sie „~pattern“ und „!pattern“ für positive und negative reguläre Ausdrücke.

Dies ähnelt dem Aufruf des Befehls „x“ für jede anwendbare Variable.

X [vars] Identisch mit „V currentpackage [vars]“.

y [Ebene [vars]]
Zeigt alle (oder einige) lexikalische Variablen (Mnemonik: „mY“-Variablen) im an
aktueller Geltungsbereich bzw Grad des Bereiche höher. Sie können die von Ihnen verwendeten Variablen einschränken
siehe mit vars Das funktioniert genauso wie bei den Befehlen „V“ und „X“.
Erfordert die Modulversion „PadWalker“ 0.08 oder höher; Ich werde Sie warnen, wenn dies der Fall ist
ist nicht installiert. Die Ausgabe erfolgt hübsch im gleichen Stil wie für „V“ und
Das Format wird durch die gleichen Optionen gesteuert.

T Erstellen Sie einen Stack-Backtrace. Einzelheiten zur Ausgabe finden Sie weiter unten.

s [expr] Einzelschritt. Wird absteigend bis zum Beginn einer anderen Anweisung ausgeführt
in Unterprogrammaufrufe umwandeln. Wenn ein Ausdruck angegeben wird, der eine Funktion enthält
Bei Anrufen wird es ebenfalls einschrittig sein.

n [expr] Weiter. Wird über Unterprogrammaufrufe hinweg bis zum Beginn des nächsten ausgeführt
Stellungnahme. Wenn ein Ausdruck angegeben wird, der Funktionsaufrufe enthält, sind diese
Funktionen werden mit Stopps vor jeder Anweisung ausgeführt.

r Fahren Sie fort, bis Sie aus dem aktuellen Unterprogramm zurückkehren. Geben Sie den Rückgabewert aus
wenn die Option „PrintRet“ gesetzt ist (Standard).

Wiederholen Sie den letzten Befehl „n“ oder „s“.

c [Zeile|Sub]
Fahren Sie fort und fügen Sie optional einen einmaligen Haltepunkt an der angegebenen Stelle ein
Zeile oder Unterprogramm.

l Nächstes Zeilenfenster auflisten.

l min+incr Listet „incr+1“ Zeilen auf, die bei „min“ beginnen.

l min-max Listen Sie die Zeilen „min“ bis „max“ auf. „l -“ ist gleichbedeutend mit „-“.

l Zeile Listet eine einzelne Zeile auf.

l subname Listet das erste Fenster mit Zeilen aus der Unterroutine auf. Untername kann eine Variable sein, die
enthält eine Codereferenz.

- Vorheriges Zeilenfenster auflisten.

v [Zeile] Zeigt einige Codezeilen rund um die aktuelle Zeile an.

. Setzen Sie den internen Debugger-Zeiger auf die zuletzt ausgeführte Zeile zurück und drucken Sie ihn aus
diese Linie.

f Dateiname Wechseln Sie zur Anzeige einer anderen Datei oder „eval“-Anweisung. Wenn Dateinamen ist kein
Wenn der vollständige Pfadname in den Werten von %INC enthalten ist, wird er als regulärer Ausdruck betrachtet.

„eval“-Zeichenfolgen (sofern zugänglich) gelten als Dateinamen: „f (eval
7)“ und „f eval 7\b“ greifen auf den Hauptteil der 7. „eval“-Zeichenfolge zu (in der Reihenfolge).
der Ausführung). Die Körper des aktuell ausgeführten „eval“ und des „eval“ed
Zeichenfolgen, die Unterprogramme definieren, werden gespeichert und sind somit zugänglich.

/pattern/ Vorwärts nach Muster suchen (ein Perl-Regex); final / ist optional. Die Suche
Standardmäßig wird die Groß-/Kleinschreibung nicht beachtet.

?Muster? Suche rückwärts nach Muster; endgültig? es ist optional. Die Suche ist Fall-
standardmäßig unempfindlich.

L [abw] Listet (standardmäßig alle) Aktionen, Haltepunkte und Überwachungsausdrücke auf

S [[!]regex]
Listen Sie Unterprogrammnamen auf, die nicht mit dem regulären Ausdruck übereinstimmen.

t [n] Trace-Modus umschalten (siehe auch Option „AutoTrace“). Optionales Argument ist das
maximale Anzahl der zu verfolgenden Ebenen unterhalb der aktuellen; alles tiefer als
das wird schweigen.

t [n] expr Trace durch Ausführung von „expr“. Das optionale erste Argument ist das Maximum
Anzahl der Ebenen, die unterhalb der aktuellen Ebene verfolgt werden sollen; irgendetwas tieferes als das
wird schweigen. Siehe „Beispiele für die Frame-Listing-Ausgabe“ in perldebguts für
Beispiele.

b Setzt einen Haltepunkt in der aktuellen Zeile

b [Zeile] [Bedingung]
Setzen Sie einen Haltepunkt vor der angegebenen Zeile. Wenn eine Bedingung angegeben ist, ist sie es
wird jedes Mal ausgewertet, wenn die Anweisung erreicht wird: Ein Haltepunkt wird nur dann eingenommen, wenn
die Bedingung ist wahr. Haltepunkte dürfen nur auf Zeilen gesetzt werden, die mit beginnen
ausführbare Anweisung. Bedingungen verwenden kein „if“:

b 237 $x > 30
b 237 ++$count237 < 11
b 33 /Muster/i

Wenn die Zeilennummer „.“ ist, wird ein Haltepunkt in der aktuellen Zeile gesetzt:

B . $n > 100

b [Datei]:[Zeile] [Bedingung]
Setzen Sie einen Haltepunkt vor der angegebenen Zeile in einer (möglicherweise anderen) Datei. Wenn ein
Wenn eine Bedingung angegeben ist, wird sie jedes Mal ausgewertet, wenn die Anweisung erreicht wird: a
Der Haltepunkt wird nur verwendet, wenn die Bedingung wahr ist. Haltepunkte dürfen nur sein
Wird auf Zeilen gesetzt, die eine ausführbare Anweisung beginnen. Bedingungen verwenden kein „if“:

b lib/MyModule.pm:237 $x > 30
b /usr/lib/perl5/site_perl/CGI.pm:100 ++$count100 < 11

b Untername [Bedingung]
Setzen Sie einen Haltepunkt vor der ersten Zeile der benannten Unterroutine. Untername Mai
eine Variable sein, die eine Codereferenz enthält (in diesem Fall Zustand ist nicht
unterstützt).

b Untername verschieben [Bedingung]
Setzen Sie einen Haltepunkt in der ersten Zeile der Unterroutine, nachdem diese kompiliert wurde.

b Dateiname laden
Setzen Sie einen Haltepunkt vor der ersten ausgeführten Zeile des Dateinamen, was sollte
ein vollständiger Pfadname sein, der unter den %INC-Werten gefunden wird.

b Kompilieren Sie den Unternamen
Setzt einen Haltepunkt vor der ersten Anweisung, die nach dem angegebenen ausgeführt wird
Unterprogramm wird kompiliert.

B-Zeile Löscht einen Haltepunkt vom angegebenen Linie.

B * Alle installierten Haltepunkte löschen.

deaktivieren Sie [Datei]:[Zeile]
Deaktivieren Sie den Haltepunkt, damit die Ausführung des Programms nicht gestoppt wird.
Haltepunkte sind standardmäßig aktiviert und können mit der Schaltfläche „Aktivieren“ wieder aktiviert werden.
Befehl.

[Zeile] deaktivieren
Deaktivieren Sie den Haltepunkt, damit die Ausführung des Programms nicht gestoppt wird.
Haltepunkte sind standardmäßig aktiviert und können mit der Schaltfläche „Aktivieren“ wieder aktiviert werden.
Befehl.

Dies erfolgt für einen Haltepunkt in der aktuellen Datei.

[Datei]:[Zeile] aktivieren
Aktivieren Sie den Haltepunkt, damit die Ausführung des Programms gestoppt wird.

aktivieren [Zeile]
Aktivieren Sie den Haltepunkt, damit die Ausführung des Programms gestoppt wird.

Dies erfolgt für einen Haltepunkt in der aktuellen Datei.

ein [Zeilen]-Befehl
Legen Sie eine Aktion fest, die ausgeführt werden soll, bevor die Zeile ausgeführt wird. Wenn Linie wird weggelassen, gesetzt
eine Aktion in der Zeile, die ausgeführt werden soll. Die Reihenfolge der Schritte, die von ausgeführt werden
der Debugger ist

1. Suchen Sie nach einem Haltepunkt in dieser Zeile
2. Drucken Sie die Zeile bei Bedarf aus (Tracing)
3. Führen Sie alle mit dieser Zeile verbundenen Aktionen aus
4. Geben Sie dem Benutzer eine Eingabeaufforderung, wenn Sie sich an einem Haltepunkt oder im Einzelschritt befinden
5. Zeile auswerten

Dies gibt beispielsweise jedes Mal $foo aus, wenn Zeile 53 übergeben wird:

a 53 print „DB FOUND $foo\n“

Eine Zeile Löscht eine Aktion aus der angegebenen Zeile.

A * Alle installierten Aktionen löschen.

w expr Fügt einen globalen Überwachungsausdruck hinzu. Immer wenn ein überwachtes Global den Debugger ändert
stoppt und zeigt die alten und neuen Werte an.

W expr Überwachungsausdruck löschen

W * Alle Überwachungsausdrücke löschen.

o Alle Optionen anzeigen.

o booloption ...
Setzen Sie jede aufgelistete boolesche Option auf den Wert 1.

o irgendeine Option? ...
Den Wert einer oder mehrerer Optionen ausdrucken.

o Option=Wert ...
Legen Sie den Wert einer oder mehrerer Optionen fest. Wenn der Wert interne Leerzeichen enthält,
es sollte zitiert werden. Sie könnten beispielsweise „o pager="less -MQeicsNfr"“ festlegen.
anrufen weniger mit diesen spezifischen Optionen. Sie können entweder Single oder Double verwenden
Anführungszeichen, aber wenn Sie dies tun, müssen Sie alle eingebetteten Instanzen derselben Art maskieren
Zitat, mit dem Sie begonnen haben, sowie alle entkommenden Entkommen, die sofort entkommen
stehen vor diesem Zitat, sollen aber nicht dazu gedacht sein, das Zitat selbst zu umgehen. In
Mit anderen Worten: Sie befolgen die Regeln für einfache Anführungszeichen, unabhängig vom Anführungszeichen. zB: „o
option='das ist nicht schlecht'" oder "o option="Sie sagte: \"Ist es nicht?\""".

Aus historischen Gründen ist der „=Wert“ optional, wird aber nur dort standardmäßig auf 1 gesetzt
Dies ist sicher – vor allem bei booleschen Optionen. Es ist immer besser
um mit „=“ einen bestimmten Wert zuzuweisen. Die „Option“ kann aber abgekürzt werden
Aus Gründen der Klarheit sollte dies wahrscheinlich nicht der Fall sein. Es können mehrere Optionen gemeinsam eingestellt werden. Sehen
Eine Liste davon finden Sie unter „Konfigurierbare Optionen“.

< ? Listen Sie alle Perl-Befehlsaktionen vor der Eingabeaufforderung auf.

< [Befehl]
Legen Sie eine Aktion (Perl-Befehl) fest, die vor jeder Debugger-Eingabeaufforderung ausgeführt werden soll. Ein Multi-
Ein Zeilenbefehl kann durch Backslashing der Zeilenumbrüche eingegeben werden.

< * Alle Perl-Befehlsaktionen vor der Eingabeaufforderung löschen.

<< Befehl Fügen Sie eine Aktion (Perl-Befehl) hinzu, die vor jeder Debugger-Eingabeaufforderung ausgeführt wird. Ein Multi-
Der Zeilenbefehl kann durch Zurücksetzen der Zeilenumbrüche eingegeben werden.

> ? Listen Sie Perl-Befehlsaktionen nach der Eingabeaufforderung auf.

> Befehl Legen Sie eine Aktion (Perl-Befehl) fest, die nach der Eingabeaufforderung ausgeführt werden soll, wenn Sie sie gerade eingegeben haben
ein Befehl, um zur Ausführung des Skripts zurückzukehren. Ein mehrzeiliger Befehl kann sein
eingegeben durch Backslashing der Zeilenumbrüche (wir wetten, dass Sie das nicht erraten haben).
jetzt).

> * Alle Perl-Befehlsaktionen nach der Eingabeaufforderung löschen.

>> Befehl Fügt eine Aktion (Perl-Befehl) hinzu, die nach der Eingabeaufforderung ausgeführt wird, wenn Sie dies gerade getan haben
einen Befehl erhalten, mit der Ausführung des Skripts fortzufahren. Ein mehrzeiliger Befehl kann
durch Backslashing der Zeilenumbrüche eingegeben werden.

{ ? Listen Sie Debugger-Befehle vor der Eingabeaufforderung auf.

{ [ Befehl ]
Legen Sie eine Aktion (Debugger-Befehl) fest, die vor jeder Debugger-Eingabeaufforderung ausgeführt wird. A
Mehrzeilige Befehle können wie gewohnt eingegeben werden.

Da dieser Befehl in mancher Hinsicht neu ist, wird beim Erscheinen eine Warnung ausgegeben
stattdessen versehentlich einen Block betreten zu haben. Wenn es das ist, was du vorhast,
schreiben Sie es wie mit „;{ ... }“ oder sogar „do { ... }“.

{ * Löschen Sie alle Debugger-Befehle vor der Eingabeaufforderung.

{{ Befehl Fügen Sie eine Aktion (Debugger-Befehl) hinzu, die vor jeder Debugger-Eingabeaufforderung ausgeführt wird. A
Es kann ein mehrzeiliger Befehl eingegeben werden, wenn Sie erraten können, wie: siehe oben.

! Zahl Wiederholen Sie einen vorherigen Befehl (standardmäßig der vorherige Befehl).

! -number Wiederholen Sie die Nummer des vorherigen Befehls.

! Muster Wiederholen Sie den letzten Befehl, der mit Muster begonnen hat. Siehe auch „o RecallCommand“.

!! cmd Führen Sie cmd in einem Unterprozess aus (liest aus DB::IN, schreibt nach DB::OUT). Siehe „o
„shellBang“ ebenfalls. Beachten Sie, dass die aktuelle Shell des Benutzers (nun ja, seine $ENV{SHELL}
Variable) verwendet werden, was die ordnungsgemäße Interpretation des Ausgangs beeinträchtigen kann
Status- oder Signal- und Coredump-Informationen.

Quelldatei Debugger-Befehle lesen und ausführen aus Datei. Datei kann selbst enthalten
„Quelle“-Befehle.

H -Nummer Zeigt die letzten n Befehle an. Es werden nur Befehle aufgelistet, die länger als ein Zeichen sind.
If Anzahl weggelassen wird, listen Sie sie alle auf.

q oder ^D Beenden. („Beenden“ funktioniert hier nicht, es sei denn, Sie haben einen Alias ​​erstellt.) Dies ist das
Es wird nur die Möglichkeit unterstützt, den Debugger zu beenden, auch wenn die zweimalige Eingabe von „exit“ möglicherweise erforderlich ist
Arbeit.

Setzen Sie die Option „inhibit_exit“ auf 0, wenn Sie am Ende aussteigen möchten
das Drehbuch. Möglicherweise müssen Sie $finished auch auf 0 setzen, wenn Sie einen Schritt ausführen möchten
durch globale Zerstörung.

R Starten Sie den Debugger neu, indem Sie mit „exec()“ eine neue Sitzung starten. Wir versuchen, Ihre zu pflegen
Der Verlauf ist hiervon nicht betroffen, möglicherweise jedoch interne Einstellungen und Befehlszeilenoptionen
verloren.

Die folgenden Einstellungen bleiben derzeit erhalten: Verlauf, Haltepunkte, Aktionen,
Debugger-Optionen und die Perl-Befehlszeilenoptionen -w, -I und -e.

|dbcmd Führen Sie den Debugger-Befehl aus und leiten Sie DB::OUT an Ihren aktuellen Pager weiter.

||dbcmd Gleich wie „|dbcmd“, aber DB::OUT ist vorübergehend ebenfalls „ausgewählt“.

= [Aliaswert]
Definieren Sie einen Befehlsalias, z

= q beenden

oder aktuelle Aliase auflisten.

Befehl Befehl als Perl-Anweisung ausführen. Es wird ein abschließendes Semikolon bereitgestellt.
Wenn die Perl-Anweisung andernfalls mit einem Perl-Debugger verwechselt würde, verwenden Sie a
auch führendes Semikolon.

m expr Listet auf, welche Methoden für das Ergebnis des ausgewerteten Ausdrucks aufgerufen werden können.
Der Ausdruck kann als Verweis auf ein gesegnetes Objekt oder auf ein ausgewertet werden
Paketnamen.

M Alle geladenen Module und deren Versionen anzeigen.

Mann [Manpage]
Trotz seines Namens ruft dies den Standarddokumentations-Viewer Ihres Systems auf
gegebene Seite, oder auf dem Viewer selbst, wenn Manpage wurde weggelassen. Wenn dieser Betrachter es ist
Mann, werden zum Aufruf die aktuellen „Config“-Informationen verwendet Mann mit dem richtigen
MANPATH oder -M Manpath Möglichkeit. Fehlgeschlagene Suchvorgänge der Form „XXX“, die übereinstimmen
bekannte Hilfeseiten des Formulars perlXXX wird erneut versucht. Hier können Sie „man“ eingeben
debug“ oder „man op“ aus dem Debugger.

Auf Systemen, die traditionell nicht nutzbar sind Mann Befehl, den der Debugger aufruft
perldoc. Gelegentlich ist diese Bestimmung aufgrund von Widerspenstigkeit falsch
Anbietern oder besser gesagt, an unternehmungslustige Benutzer. Wenn Sie hineinfallen
In beiden Kategorien müssen Sie die Variable $DB::doccmd einfach manuell auf einen beliebigen Viewer setzen
um die Perl-Dokumentation auf Ihrem System anzuzeigen. Dies kann in einer RC-Datei festgelegt werden,
oder durch direkte Zuweisung. Wir warten immer noch auf ein funktionierendes Beispiel dafür
sowas in der richtung:

$DB::doccmd = 'netscape -remote http://something.here/';

konfigurierbare Optionen
Der Debugger verfügt über zahlreiche Optionen, die mit dem Befehl „o“ entweder interaktiv oder interaktiv einstellbar sind
aus der Umgebung oder einer RC-Datei. (./.perldb oder ~/.perldb unter Unix.)

„recallCommand“, „ShellBang“
Die Zeichen, die verwendet werden, um einen Befehl abzurufen oder eine Shell zu erzeugen. Standardmäßig beides
sind auf „!“ gesetzt, was bedauerlich ist.

„pager“ Programm zur Ausgabe von Pager-Befehlen (die mit einem „|“ beginnen)
Zeichen.) Standardmäßig wird $ENV{PAGER} verwendet. Weil der Debugger verwendet
Ihre aktuellen Terminaleigenschaften für Fettdruck und Unterstreichung, falls ausgewählt
Pager leitet Escape-Sequenzen nicht unverändert durch, die Ausgabe einiger
Debugger-Befehle sind nicht lesbar, wenn sie über den Pager gesendet werden.

„tkRunning“ Führen Sie Tk während der Eingabeaufforderung aus (mit ReadLine).

„signalLevel“, „warnLevel“, „dieLevel“
Grad der Ausführlichkeit. Standardmäßig hinterlässt der Debugger Ihre Ausnahmen und
Warnungen allein, da ihre Änderung dazu führen kann, dass ordnungsgemäß laufende Programme beschädigt werden.
Es wird versucht, eine Nachricht zu drucken, wenn INT-, BUS- oder SEGV-Signale nicht erfasst werden
ankommen. (Siehe aber die Erwähnung von Signalen unter „FEHLER“ weiter unten.)

Um diesen standardmäßigen abgesicherten Modus zu deaktivieren, legen Sie diese Werte auf einen höheren Wert als fest
0. Bei einem Level von 1 erhalten Sie Backtraces, wenn Sie irgendeine Art von Warnung erhalten
(das ist oft ärgerlich) oder Ausnahme (das ist oft wertvoll).
Leider kann der Debugger keine schwerwiegenden Ausnahmen von nicht schwerwiegenden Ausnahmen unterscheiden
Einsen. Wenn „dieLevel“ sogar 1 ist, werden auch Ihre nicht schwerwiegenden Ausnahmen verfolgt
und kurzerhand geändert, wenn sie aus „bewerteten“ Strings oder von anderen stammten
eine Art „Bewertung“ innerhalb der Module, die Sie laden möchten. Wenn „dieLevel“ 2 ist,
Dem Debugger ist es egal, woher sie kommen: Er usurpiert Ihre Ausnahme
Handler und gibt einen Trace aus und ändert dann alle Ausnahmen mit seinem eigenen
Verzierungen. Dies kann vielleicht für einige Nachverfolgungszwecke nützlich sein, aber
neigt dazu, jedes Programm, das seine Ausnahmebehandlung in Anspruch nimmt, hoffnungslos zu zerstören
ernst.

Trace-Modus „AutoTrace“ (ähnlich dem Befehl „t“, kann aber in „PERLDB_OPTS“ eingefügt werden).

„LineInfo“ Datei oder Pipe, in die Zeilennummerninformationen gedruckt werden sollen. Wenn es sich um eine Pfeife handelt (z. B.
„|visual_perl_db“), dann wird eine kurze Nachricht verwendet. Dies ist der verwendete Mechanismus
um mit einem Slave-Editor oder visuellen Debugger zu interagieren, z. B. dem speziellen „vi“
oder „emacs“-Hooks oder den grafischen Debugger „ddd“.

„inhibit_exit“
Wenn 0, erlaubt Schrittmotoren WOW! das Ende des Drehbuchs.

„PrintRet“ Gibt den Rückgabewert nach dem Befehl „r“ aus, falls festgelegt (Standard).

„Ornamente“ Beeinflusst das Erscheinungsbild der Befehlszeile auf dem Bildschirm (siehe Term::ReadLine). Es gibt
Derzeit gibt es keine Möglichkeit, diese zu deaktivieren, wodurch einige Ausgaben unleserlich werden können
einigen Displays oder mit einigen Pagern. Dies wird als Fehler angesehen.

„frame“ Beeinflusst das Drucken von Meldungen beim Ein- und Ausstieg aus Unterprogrammen. Wenn
„frame & 2“ ist falsch, Nachrichten werden nur bei der Eingabe gedruckt. (Drucken beim Beenden
könnte nützlich sein, wenn es mit anderen Nachrichten durchsetzt wird.)

Bei „frame & 4“ werden Argumente für Funktionen sowie Kontext und Aufrufer ausgegeben
die Info. Wenn „Frame & 8“, „Stringify“ und „Tie“ überladen sind, ist „FETCH“ aktiviert
die gedruckten Argumente. Wenn „Frame & 16“, der Rückgabewert der Unterroutine
gedruckt ist.

Die Länge, um die die Argumentliste gekürzt wird, wird durch das nächste geregelt
Option:

„maxTraceLen“
Länge zum Abschneiden der Argumentliste, wenn Bit 4 der Option „frame“ gesetzt ist.

"Fenstergröße"
Ändern Sie die Größe des Codelistenfensters (Standard sind 10 Zeilen).

Die folgenden Optionen beeinflussen, was mit den Befehlen „V“, „X“ und „x“ passiert:

„arrayDepth“, „hashDepth“
Gibt nur die ersten N Elemente aus ('' für alle).

„dumpDepth“ Begrenzt die Rekursionstiefe beim Dumpen von Strukturen auf N Ebenen. Negative Werte
werden als Unendlichkeit interpretiert. Standard: unendlich.

„compactDump“, „veryCompact“
Ändern Sie den Stil der Array- und Hash-Ausgabe. Bei „compactDump“ kann es sich um ein kurzes Array handeln
in einer Zeile gedruckt werden.

„globPrint“ Gibt an, ob der Inhalt von Globs gedruckt werden soll.

„DumpDBFiles“
Speichert Arrays mit debuggten Dateien.

„DumpPackages“
Symboltabellen von Paketen ausgeben.

„DumpReused“
Dump-Inhalte von „wiederverwendeten“ Adressen.

„quote“, „HighBit“, „undefPrint“
Ändern Sie den Stil des String-Dumps. Der Standardwert für „quote“ ist „auto“; eins
Sie können das Format mit doppelten oder einfachen Anführungszeichen aktivieren, indem Sie es auf „““ oder setzen
"'", jeweils. Standardmäßig werden Zeichen gedruckt, deren High-Bit gesetzt ist
wörtlich.

„UsageOnly“ Rudimentäres Speicherauslastungs-Dump pro Paket. Berechnet die Gesamtgröße der Zeichenfolgen
in Variablen im Paket gefunden. Dies gilt nicht für Lexika in a
Dateibereich des Moduls oder geht bei Schließungen verloren.

„HistFile“ Der Pfad der Datei, aus der der Verlauf stammt (eine verwendbare Term::ReadLine vorausgesetzt
Backend) wird beim Start des Debuggers gelesen und dort gespeichert
beim Herunterfahren (für Persistenz über Sitzungen hinweg). Ähnliches Konzept wie Bash
Datei „.bash_history“.

„HistSize“ Die Anzahl der gespeicherten Zeilen im Verlauf (vorausgesetzt „HistFile“ oben).

Nachdem die RC-Datei gelesen wurde, liest der Debugger die Umgebungsvariable $ENV{PERLDB_OPTS}
und analysiert dies als den Rest einer „O ...“-Zeile, wie man sie im Debugger eingeben könnte
prompt. Sie können die Initialisierungsoptionen „TTY“, „noTTY“, „ReadLine“ und platzieren
„NonStop“ da.

Wenn Ihre RC-Datei Folgendes enthält:

parse_options("NonStop=1 LineInfo=db.out AutoTrace");

Dann wird Ihr Skript ohne menschliches Eingreifen ausgeführt und fügt Trace-Informationen in das ein
Datei db.out. (Wenn Sie es unterbrechen, sollten Sie „LineInfo“ besser auf zurücksetzen /dev/tty wenn du
erwarte, etwas zu sehen.)

„TTY“ Das TTY, das zum Debuggen von E/A verwendet werden soll.

„noTTY“ Wenn festgelegt, wechselt der Debugger in den „NonStop“-Modus und stellt keine Verbindung zu einem TTY her.
Bei Unterbrechung (oder wenn die Kontrolle über die explizite Einstellung von an den Debugger geht
$DB::signal oder $DB::single aus dem Perl-Skript) stellt eine Verbindung zu einem TTY her
beim Start in der Option „TTY“ angegeben oder an ein TTY, das zur Laufzeit mit gefunden wird
das Modul „Term::Rendezvous“ Ihrer Wahl.

Dieses Modul sollte eine Methode namens „new“ implementieren, die ein Objekt mit zurückgibt
zwei Methoden: „IN“ und „OUT“. Diese sollten Dateihandles zurückgeben, die verwendet werden sollen
Eingabe und Ausgabe entsprechend debuggen. Die „neue“ Methode sollte prüfen
ein Argument, das beim Start den Wert von $ENV{PERLDB_NOTTY} enthält, oder
„$ENV{HOME}/.perldbtty$$“ andernfalls. Diese Datei wird nicht auf ihre Richtigkeit überprüft
Eigentum, sodass Sicherheitsrisiken theoretisch möglich sind.

„ReadLine“ Wenn „false“, ist die Readline-Unterstützung im Debugger zum Debuggen deaktiviert
Anwendungen, die selbst ReadLine verwenden.

„NonStop“ Wenn festgelegt, wechselt der Debugger in den nicht-interaktiven Modus, bis er unterbrochen wird, oder
programmgesteuert durch Festlegen von $DB::signal oder $DB::single.

Hier ist ein Beispiel für die Verwendung der Variablen $ENV{PERLDB_OPTS}:

$ PERLDB_OPTS="NonStop Frame=2" perl -d mein Programm

Dadurch wird das Skript ausgeführt meinProgramm ohne menschliches Zutun den Aufrufbaum ausdrucken
mit Ein- und Ausstiegspunkten. Beachten Sie, dass „NonStop=1 Frame=2“ äquivalent zu „N f=2“ ist und
dass Optionen ursprünglich eindeutig durch den ersten Buchstaben (modulo the) abgekürzt werden konnten
„Dump*“-Optionen). Dennoch empfiehlt es sich, diese immer vollständig auszuschreiben
für bessere Lesbarkeit und zukünftige Kompatibilität.

Andere Beispiele schließen ein

$ PERLDB_OPTS="NonStop LineInfo=listing frame=2" perl -d myprogram

das das Skript nicht interaktiv ausführt und Informationen zu jedem Eintrag in eine Unterroutine ausgibt und
jede ausgeführte Zeile in die benannte Datei listing. (Wenn Sie es unterbrechen, wäre es besser
„LineInfo“ auf etwas „Interaktives“ zurücksetzen!)

Weitere Beispiele sind (die Verwendung der Standard-Shell-Syntax zum Anzeigen von Umgebungsvariablen
Einstellungen):

$ ( PERLDB_OPTS="NonStop Frame=1 AutoTrace LineInfo=tperl.out"
perl -d mein Programm )

Dies kann zum Debuggen eines Programms nützlich sein, das „Term::ReadLine“ selbst verwendet. Nicht
Vergessen Sie nicht, Ihre Shell im entsprechenden Fenster vom TTY zu trennen /dev/ttyXX,
sagen wir, indem Sie einen Befehl wie „ausgeben“.

$ schlaf 1000000

Weitere Informationen finden Sie unter „Debugger-Interna“ in perldebguts.

Debugger Input / Output
Eingabeaufforderung Die Debugger-Eingabeaufforderung sieht etwa so aus

DB<8>

oder

DB<<17>>

Dabei handelt es sich bei dieser Nummer um die Befehlsnummer, auf die Sie mit zugreifen würden
eingebaut csh-ähnlicher Geschichtsmechanismus. Beispielsweise würde „!17“ den Befehl wiederholen
Nummer 17. Die Tiefe der spitzen Klammern gibt die Verschachtelungstiefe der an
Debugger. Sie könnten beispielsweise mehr als einen Satz Klammern erhalten, wenn Sie möchten
bereits an einem Haltepunkt und gab dann das Ergebnis eines Funktionsaufrufs selbst aus
hat einen Haltepunkt, oder Sie treten mit dem Befehl „s/n/t expression“ in einen Ausdruck ein.

Mehrzeilige Befehle
Wenn Sie einen mehrzeiligen Befehl eingeben möchten, z. B. eine Unterprogrammdefinition mit
Wenn Sie mehrere Anweisungen oder ein Format verwenden, maskieren Sie den Zeilenumbruch, der normalerweise endet
Debugger-Befehl mit einem Backslash. Hier ist ein Beispiel:

DB<1> für (1..4) { \
Fortsetzung: print "ok\n"; \
Fortsetzung: }
ok
ok
ok
ok

Beachten Sie, dass dieser Vorgang des Escapens eines Zeilenumbruchs spezifisch für interaktive Befehle ist
in den Debugger eingegeben.

Stack-Backtrace
Hier ist ein Beispiel dafür, wie ein Stack-Backtrace per „T“-Befehl aussehen könnte:

$ = main::infested wird aus der Datei „Ambulation.pm“ Zeile 10 aufgerufen
@ = Ambulation::legs(1, 2, 3, 4) aufgerufen aus der Datei „camel_flea“ Zeile 7
$ = main::pests('bactrian', 4) aus der Datei 'camel_flea' Zeile 4 aufgerufen

Das linke Zeichen dort oben gibt den Kontext an, in dem sich die Funktion befand
aufgerufen, wobei „$“ und „@“ jeweils Skalar- bzw. Listenkontexte bedeuten und „.“
bedeutet leeren Kontext (was eigentlich eine Art Skalarkontext ist). Der Bildschirm
oben steht, dass Sie sich in der Funktion „main::infested“ befanden, als Sie den Stapel ausgeführt haben
dump und dass es im skalaren Kontext ab Zeile 10 der Datei aufgerufen wurde
Ambulation.pm, aber ohne jegliche Argumente, was bedeutet, dass es als aufgerufen wurde
&befallen. Der nächste Stapelrahmen zeigt, dass die Funktion „Ambulation::legs“ war
im Listenkontext aus aufgerufen camel_flea Datei mit vier Argumenten. Das Letzte
Der Stapelrahmen zeigt, dass „main::pests“ im skalaren Kontext aufgerufen wurde, ebenfalls von
camel_flea, aber ab Zeile 4.

Wenn Sie den Befehl „T“ innerhalb einer aktiven „use“-Anweisung ausführen, wird der
Backtrace enthält sowohl einen „require“-Frame als auch einen „eval“-Frame.

Zeilenlistenformat
Dies zeigt die Arten von Ausgaben, die der Befehl „l“ erzeugen kann:

DB<<13>> l
101: @i{@i} = ();
102:b @isa{@i,$pack} = ()
103 if(exists $i{$prevpack} || existiert $isa{$pack});
104}
105
106 weiter
107==> if(exists $isa{$pack});
108
109:a if ($extra-- > 0) {
110: %isa = ($pack,1);

Zerbrechliche Linien sind mit „:“ gekennzeichnet. Zeilen mit Haltepunkten sind mit „b“ und gekennzeichnet
diejenigen mit Aktionen von „a“. Die Zeile, die ausgeführt werden soll, ist mit markiert
„==>“.

Bitte beachten Sie, dass der Code in den Debugger-Auflistungen möglicherweise nicht mit Ihrem Code übereinstimmt
Original-Quellcode. Leitungsanweisungen und externe Quellenfilter können die ändern
Code, bevor Perl ihn sieht, was dazu führt, dass sich der Code von seinen ursprünglichen Positionen bewegt oder einnimmt
in völlig unterschiedlichen Formen.

Rahmenliste
Wenn die Option „Frame“ festgelegt ist, druckt der Debugger eingegebene (und optionale)
beendet) Unterprogramme in verschiedenen Stilen. Sehen Sie Perldebguts unglaublich lange
Beispiele hierfür.

Fehlerbeseitigung Kompilierungszeit Statements
Wenn Sie zur Kompilierungszeit ausführbare Anweisungen haben (z. B. Code in BEGIN, UNITCHECK und
CHECK-Blöcke oder „use“-Anweisungen), diese werden nicht kann jedoch vom Debugger gestoppt werden
„require“- und INIT-Blöcke werden verwendet, und Anweisungen zur Kompilierungszeit können mit verfolgt werden
Option „AutoTrace“ in „PERLDB_OPTS“ festgelegt). Mit Ihrem eigenen Perl-Code ist dies jedoch möglich
Übertragen Sie die Kontrolle mithilfe der folgenden Anweisung zurück an den Debugger. Dies ist harmlos, wenn
Der Debugger läuft nicht:

$DB::single = 1;

Wenn Sie $DB::single auf 2 setzen, entspricht dies der Eingabe des Befehls „n“.
Ein Wert von 1 bedeutet den Befehl „s“. Die Variable $DB::trace sollte auf 1 gesetzt werden
Simulieren Sie die Eingabe des Befehls „t“.

Eine andere Möglichkeit, Code zur Kompilierungszeit zu debuggen, besteht darin, den Debugger zu starten und einen Haltepunkt festzulegen
Belastung eines Moduls:

DB<7> b lädt f:/perllib/lib/Carp.pm
Stoppt beim Laden von „f:/perllib/lib/Carp.pm“.

und starten Sie dann den Debugger mit dem Befehl „R“ neu (falls möglich). Man kann „b-compile“ verwenden
Subname“ für den gleichen Zweck.

Debugger Maßgeschneidert
Der Debugger enthält wahrscheinlich genügend Konfigurations-Hooks, die Sie nie benötigen werden
modifizieren Sie es selbst. Sie können das Verhalten des Debuggers im Debugger ändern
mit dem Befehl „o“, von der Befehlszeile über die Umgebungsvariable „PERLDB_OPTS“,
und aus Anpassungsdateien.

Sie können einige Anpassungen vornehmen, indem Sie eine einrichten .perldb Datei, die die Initialisierung enthält
Code. Sie könnten zum Beispiel Aliase wie diesen erstellen (der letzte ist der, den die Leute erwarten).
da zu sein):

$DB::alias{'len'} = 's/^len(.*)/p length($1)/';
$DB::alias{'stop'} = 's/^stop (at|in)/b/';
$DB::alias{'ps'} = 's/^ps\b/p Skalar /';
$DB::alias{'quit'} = 's/^quit(\s*)/exit/';

Sie können die Optionen unter ändern .perldb durch Aufrufe wie diesen;

parse_options("NonStop=1 LineInfo=db.out AutoTrace=1 frame=2");

Der Code wird im Paket „DB“ ausgeführt. Beachten Sie, dass .perldb wird vorher bearbeitet
Verarbeitung „PERLDB_OPTS“. Wenn .perldb definiert die Unterroutine „afterinit“, also die Funktion
wird aufgerufen, nachdem die Debugger-Initialisierung beendet ist. .perldb kann im Strom enthalten sein
Verzeichnis oder im Home-Verzeichnis. Weil diese Datei von Perl stammt und möglicherweise
beliebige Befehle enthalten, aus Sicherheitsgründen muss es dem Superuser oder dem gehören
aktueller Benutzer und nur für den Besitzer beschreibbar.

Sie können die TTY-Eingabe für den Debugger verfälschen, indem Sie beliebige Befehle zu @DB::typeahead hinzufügen. Für
Beispiel, Ihr .perldb Die Datei könnte Folgendes enthalten:

sub afterinit { push @DB::typeahead, "b 4", "b 6"; }

Dadurch würde versucht werden, Haltepunkte in den Zeilen 4 und 6 unmittelbar nach dem Debugger zu setzen
Initialisierung. Beachten Sie, dass @DB::typeahead keine unterstützte Schnittstelle ist und unterliegt
Änderungen in zukünftigen Versionen.

Wenn Sie den Debugger ändern möchten, kopieren Sie ihn perl5db.pl von der Perl-Bibliothek zu einem anderen Namen
und hacke es nach Herzenslust. Anschließend möchten Sie Ihre „PERL5DB“-Umgebung festlegen
Variable, um etwa Folgendes zu sagen:

BEGIN { erfordert „myperl5db.pl“ }

Als letzten Ausweg können Sie auch „PERL5DB“ verwenden, um den Debugger direkt anzupassen
Interne Variablen setzen oder Debugger-Funktionen aufrufen.

Beachten Sie, dass alle Variablen und Funktionen, die nicht in diesem Dokument (oder in
perldebguts) sind nur für den internen Gebrauch gedacht und können sich daher ändern
ohne vorherige Ankündigung.

Readline Unterstützung / Geschichte in die Debugger
Im Auslieferungszustand ist der einzige bereitgestellte Befehlszeilenverlauf ein einfacher Verlauf, der prüft, ob
führende Ausrufezeichen. Wenn Sie jedoch Term::ReadKey und Term::ReadLine installieren
Module von CPAN (wie Term::ReadLine::Gnu, Term::ReadLine::Perl, ...) werden Sie haben
volle Bearbeitungsmöglichkeiten, ähnlich denen von GNU readline(3) sieht vor. Suchen Sie danach in der
Module/je nach Modul/Semester Verzeichnis auf CPAN. Diese unterstützen nicht normal vi Befehlszeilen
Bearbeitung jedoch.

Eine rudimentäre Befehlszeilenvervollständigung ist ebenfalls verfügbar, einschließlich lexikalischer Variablen in
der aktuelle Geltungsbereich, wenn das Modul „PadWalker“ installiert ist.

Ohne Readline-Unterstützung sehen Sie möglicherweise die Symbole „^[[A“, „^[[C“, „^[[B“, „^[[D““, „^H“,
... bei Verwendung der Pfeiltasten und/oder der Rücktaste.

Herausgeber Unterstützung für Fehlerbeseitigung
Wenn Sie die GNU-Version von haben Emacs Wenn es auf Ihrem System installiert ist, kann es mit dem interagieren
Perl-Debugger zur Bereitstellung einer integrierten Software-Entwicklungsumgebung, die an ihn erinnert
Interaktionen mit C-Debuggern.

Aktuelle Versionen von Emacs enthalten eine Startdatei zum Erstellen Emacs wirken wie ein Syntax-
gerichteter Editor, der (einige) der Perl-Syntax versteht. Siehe perlfaq3.

Benutzer von vi sollte auch mal nachschauen vim und gwim, die mausige und windige Variante, zum Ausmalen
von Perl-Schlüsselwörtern.

Beachten Sie, dass nur Perl Perl wirklich analysieren kann, daher sind alle derartigen CASE-Tools etwas unzureichend
das Zeichen, besonders wenn Sie Ihr Perl nicht wie ein C-Programmierer programmieren.

Die Perl Profiler
Wenn Sie einen alternativen Debugger für die Ausführung von Perl bereitstellen möchten, rufen Sie Ihr Skript mit a auf
Doppelpunkt und ein Paketargument, das dem übergeben wird -d Flagge. Zu den alternativen Debuggern von Perl gehören a
Perl-Profiler Devel::NYTProf, der separat als CPAN-Distribution erhältlich ist. Zu
Profilieren Sie Ihr Perl-Programm in der Datei mycode.pl, Schreib einfach:

$ perl -d:NYTProf mycode.pl

Wenn das Skript beendet wird, erstellt der Profiler eine Datenbank mit den Profilinformationen
die Sie mit den Profiler-Tools in Berichte umwandeln können. Sehen für Details.

Fehlerbeseitigung Normale Ausdrücke


Mit „use re ‚debug‘“ können Sie die wichtigen Details des regulären Perl-Ausdrucks sehen
Motor funktioniert. Um diese typischerweise umfangreiche Ausgabe zu verstehen, muss man nicht nur
Ich habe eine Vorstellung davon, wie der Vergleich regulärer Ausdrücke im Allgemeinen funktioniert, weiß aber auch, wie
Die regulären Ausdrücke von Perl werden intern in einen Automaten kompiliert. Diese Angelegenheiten sind
ausführlicher untersucht in „Debugging Regular Expressions“ in perldebguts.

Fehlerbeseitigung Memory Anwendungsbereich


Perl bietet interne Unterstützung für die Meldung der eigenen Speichernutzung, dies ist jedoch durchaus möglich
fortgeschrittenes Konzept, das ein gewisses Verständnis der Funktionsweise der Speicherzuweisung erfordert. Sehen
Weitere Informationen finden Sie unter „Debuggen der Perl-Speichernutzung“ in perldebguts.

Nutzen Sie perldebug online über die Dienste von onworks.net


Kostenlose Server & Workstations

Laden Sie Windows- und Linux-Apps herunter

Linux-Befehle

Ad




×
Werbung
❤ ️Hier einkaufen, buchen oder kaufen – kostenlos, damit die Dienste kostenlos bleiben.