Wie bekomme ich die Umgebung eines Programms, während ich es in GDB debugge

8

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.

    
punekr12 02.10.2015, 22:58
quelle

2 Antworten

4

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.

Hinweis

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 .

Nachtrag: So drucken Sie die gesamte Umgebung des debugged-Programms

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:

%Vor%

Natürlich hätte ich das auch außerhalb von gdb von einem anderen Terminal aus tun können.

    
rici 02.10.2015, 23:06
quelle
1

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

prüfen     
Jonathan Wakely 02.10.2015 23:07
quelle