Wie man Umwelt, die ein Programm während des Debuggens im GDB
Ich bin Debuggen eines Programms im GDB unter linux. Ich bin mit getenv
und setenv
- Aufrufe zum Lesen und setzen von Umgebungsvariablen. Zum Beispiel rufe ich setenv("TZ", "UTC", 1);
um die TZ-environment variable für die Zeitzone.
Um zu überprüfen, ob die env-variable ist gesetzt, ich bin mit GDB-Befehl show environment
. Dieser druckt alle environment-Variablen und Ihre Werte. Aber es Dosis nicht zeigen TZ
gesetzt.
Selbst den Befehl show environment TZ
sagt Environment variable "TZ" not defined.
Ist Ihr eine weitere Möglichkeit zu prüfen, die Umgebung der zu testende Programm?
p *(char *) getenv("TZ")
reuturns richtigen Wert UTC
.
- Sollte man das nicht
p (char*)getenv("TZ")
? - Sieht aus wie
environ
NULL ist.environ@@GLIBC_2.0
ist das eine, die Punkte der realen Umgebung, in meinem Fall. stackoverflow.com/questions/6203455/... environ
funktioniert gut für mich, aber es ist wahrscheinlich im Zusammenhang mit der glibc-version (unter anderem).- OK, ich habe eine Art Druck auf die gesamte Umgebung auf meine Antwort. HTH.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dem gdb-Befehl
show environment
zeigt eine Umgebung, die gehört zugdb
[siehe Anmerkung], nicht auf die Umgebung des Programms, die gedebuggt wird.Aufrufen
getenv
scheint ein ganz vernünftiger Ansatz, um das drucken des Laufenden Programms auf die Umwelt.Hinweis
Gdb unterhält ein Umfeld, array, zunächst kopiert aus seinem eigenen Umfeld, die es verwendet, um zu Beginn jedes neuen Kind-Prozess.
show environment
undset environment
Arbeit auf diese Umgebung, soset environment
ändern einer Umgebungsvariable für den nächste mal starten Sie das Programm gedebuggt wird. Sobald das Programm gestartet wird, wird der loader kopiert die Umwelt, in der Programm-Adressraum, und alle änderungen mitsetenv
gelten für das array, nicht die, die gepflegtgdb
.Nachtrag: Wie drucken Sie die testende Programm die gesamte Umgebung
Unter Linux jeder Prozess, der die Umgebung zur Verfügung, über die pseudofile
/proc/PID/environ
, woPID
wird ersetzt durch die " pid " des Prozesses. Der Wert dieser Datei ist eine Liste von null-terminierte Zeichenfolgen, so drucken Sie es aus dauert eine kleine Menge von Arbeit.Innerhalb von gdb, nachdem Sie begonnen haben, läuft das Programm zu Debuggen, erhalten Sie die pid mit
info proc
und dann verwenden, um Druck auf die gesamte Umgebung:Natürlich, ich könnte das getan haben, genauso leicht außerhalb der gdb, von einem anderen terminal aus.
environ
was ist einchar**
; jedes element zeigt auf eine Zeichenkette in der formvar=value
environ
, das ist wohl ziemlich sinnlos. Verwenden Sie einfachgetenv
auf die Variablen, die Sie interessiert sind in. Das wird perfekt mit, was das Programm sieht.show environment
ist nicht GDB eigene Umwelt, sondern die Umwelt wird es geben, die Prozesse, die er startet, finden Sie unter sourceware.org/gdb/current/onlinedocs/gdb/Environment.html - obwohl, es beginnt wie eine Kopie der GDB-eigenen Umgebung, es kann geändert werden mitset environment
undunset environment
und GDB das eigene Umfeld sich nicht verändert.Können Sie verändern GDB Blick auf die Umgebung mit
set environment TZ =UTC
aber das hat keinen Einfluss auf ein laufendes Programm nur die Umgebung, das verwendet wird, das nächste mal einen minderwertigen Prozess gestartet.Können Sie Einsicht in laufende minderwertig Prozess' aktuelle Umgebung über die Globale variable
environ