Ich debugge ein Programm in GDB unter Linux. Ich verwende getenv
und setenv
Aufrufe, um Umgebungsvariablen zu lesen und zu setzen. Zum Beispiel rufe ich setenv("TZ", "UTC", 1);
auf, um die TZ-Umgebungsvariable für die Zeitzone festzulegen.
Um zu überprüfen, ob die env-Variable gesetzt ist, verwende ich den GDB-Befehl show environment
. Dies druckt alle Umgebungsvariablen und ihre Werte. Aber es zeigt nicht, dass TZ
gesetzt ist.
Sogar der Befehl show environment TZ
sagt Environment variable "TZ" not defined.
Gibt es eine andere Möglichkeit, die Umgebung des Debug-Programms zu überprüfen?
p *(char *) getenv("TZ")
stellt den korrekten Wert UTC
wieder her.
Der gdb-Befehl show environment
zeigt eine Umgebung, die zu gdb
gehört [siehe Anmerkung], nicht die Umgebung des Programms, das debuggt wird.
Der Aufruf von getenv
scheint ein völlig vernünftiger Ansatz zum Drucken der Umgebung des laufenden Programms zu sein.
Gdb verwaltet ein Umgebungs-Array, das anfänglich aus seiner eigenen Umgebung kopiert wurde und mit dem jeder neue untergeordnete Prozess gestartet wird. show environment
und set environment
funktionieren in dieser Umgebung, so dass set environment
eine Umgebungsvariable für das nächste Mal ändert, wenn Sie das Programm starten, das debuggt wird. Sobald das Programm gestartet wurde, hat der Loader die Umgebung in den Adressraum des Programms kopiert, und alle Änderungen, die mit setenv
vorgenommen wurden, gelten für dieses Array, nicht die von gdb
.
Unter Linux ist die Umgebung jedes Prozesses über die Pseudodatei /proc/PID/environ
verfügbar, wobei PID
durch die PID des Prozesses ersetzt wird. Der Wert dieser Datei ist eine Liste von nullterminierten Strings, so dass das Ausdrucken wenig Zeit in Anspruch nimmt.
Innerhalb von gdb, nachdem Sie das Programm gestartet haben, das debuggt werden soll, können Sie seine PID mit info proc
erhalten und diese dann zum Drucken der gesamten Umgebung verwenden:
Natürlich hätte ich das auch außerhalb von gdb von einem anderen Terminal aus tun können.
Sie können die Umgebungsansicht von GDB mit set environment TZ =UTC
ändern, aber dies betrifft nicht ein laufendes Programm, sondern nur die Umgebung, die beim nächsten Start eines minderwertigen Prozesses verwendet wird.
Sie können die aktuelle Umgebung eines laufenden untergeordneten Prozesses über die globale Variable environ
Tags und Links c c++ linux environment-variables gdb