Ich debugge ein Programm in GDB unter Linux. ich benutze getenv
und setenv
Aufrufe zum Lesen und Festlegen von Umgebungsvariablen. Ich rufe zum Beispiel an setenv("TZ", "UTC", 1);
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 gibt alle Umgebungsvariablen und ihre Werte aus. Aber es wird nicht angezeigt TZ
eingestellt werden.
Sogar Befehl show environment TZ
sagt Environment variable "TZ" not defined.
Gibt es eine andere Möglichkeit, die Umgebung des debuggten Programms zu überprüfen?
p *(char *) getenv("TZ")
gibt den korrekten Wert zurück UTC
.
Der gdb-Befehl show environment
zeigt eine Umgebung, die dazugehört gdb
[see note]nicht die Umgebung des zu debuggenden Programms.
Berufung getenv
scheint ein völlig vernünftiger Ansatz zum Drucken der Umgebung des laufenden Programms zu sein.
Notiz
Gdb verwaltet ein Environment-Array, das ursprünglich aus seiner eigenen Umgebung kopiert wurde und das zum Starten jedes neuen untergeordneten Prozesses verwendet wird. show environment
und set environment
Arbeit an dieser Umgebung, so set environment
ändert eine Umgebungsvariable für die nächstes Mal Sie starten das zu debuggende Programm. Sobald das Programm gestartet ist, hat der Lader die Umgebung in den Adressraum des Programms kopiert und alle Änderungen mit vorgenommen setenv
gelten für dieses Array, nicht für das von verwaltete gdb
.
Nachtrag: So drucken Sie die gesamte Umgebung des debuggten Programms
Unter Linux ist die Umgebung jedes Prozesses über die Pseudodatei verfügbar /proc/PID/environ
wo PID
wird durch die PID des Prozesses ersetzt. Der Wert dieser Datei ist eine Liste mit nullterminierten Zeichenfolgen, sodass das Ausdrucken ein wenig Arbeit erfordert.
Innerhalb von gdb können Sie, sobald Sie das zu debuggende Programm gestartet haben, dessen PID abrufen info proc
und verwenden Sie diese dann, um die gesamte Umgebung zu drucken:
(gdb) info proc
process 6074
...
(gdb) shell xargs -0 printf %s\\n < /proc/6074/environ
XDG_VTNR=7
KDE_MULTIHEAD=false
...
Natürlich hätte ich das genauso einfach außerhalb von gdb machen können, von einem anderen Terminal aus.
Sie können die Sicht von GDB auf die Umgebung mit ändern set environment TZ =UTC
aber das wirkt sich nicht auf ein laufendes Programm aus, sondern nur auf die Umgebung, die beim nächsten Start eines untergeordneten Prozesses verwendet wird.
Sie können die aktuelle Umgebung eines laufenden untergeordneten Prozesses über die globale Variable überprüfen environ
Sollte das nicht sein
p (char*)getenv("TZ")
?– Jonathan Wakely
2. Oktober 2015 um 23:04 Uhr
Sieht aus wie
environ
ist Null.environ@@GLIBC_2.0
ist derjenige, der in meinem Fall auf die reale Umgebung verweist. stackoverflow.com/questions/6203455/…– punekr12
2. Oktober 2015 um 23:19 Uhr
environ
funktioniert gut für mich, aber es hängt wahrscheinlich (unter anderem) mit der glibc-Version zusammen.– Rici
2. Oktober 2015 um 23:35 Uhr
@punekr12: OK, ich habe meiner Antwort eine Möglichkeit hinzugefügt, die gesamte Umgebung zu drucken. HTH.
– Rici
2. Oktober 2015 um 23:50 Uhr