So erhalten Sie die Umgebung eines Programms, während Sie es in GDB debuggen

Lesezeit: 3 Minuten

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.

  • 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

Benutzer-Avatar
rici

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/environwo 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.

  • Ich muss alle env-Variablen des Programms zum Debuggen sehen, wie geht das?

    – punekr12

    2. Oktober 2015 um 23:08 Uhr

  • @punekr12: Verwenden Sie die globale Variable environ die ein char**; Jedes Element zeigt auf eine Zeichenfolge im Formular var=value

    – Rici

    2. Oktober 2015 um 23:09 Uhr

  • @punekr12: Aber es sei denn, Ihr Programm iteriert über die Variable environ, das ist ziemlich sinnlos. Benutz einfach getenv auf die Variablen, an denen Sie interessiert sind. Das passt perfekt zu dem, was das Programm sieht.

    – Rici

    2. Oktober 2015 um 23:10 Uhr

  • show environment ist nicht die eigene Umgebung von GDB, es ist die Umgebung, die es den Prozessen gibt, die es startet, siehe sourceware.org/gdb/current/onlinedocs/gdb/Environment.html — Obwohl es als Kopie der eigenen Umgebung von GDB startet, kann es mit modifiziert werden set environment und unset environmentund die eigene Umgebung von GDB wird nicht geändert.

    – Jonathan Wakely

    2. Oktober 2015 um 23:12 Uhr


  • @JonathanWakely: Ich musste mir die Umgebung aus dem proc fs holen, um mir selbst zu beweisen, dass gdb nicht nur Variablen in seiner eigenen Umgebung setzt 🙂 Du hast recht, das tut es nicht.

    – Rici

    2. Oktober 2015 um 23:51 Uhr

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

1055240cookie-checkSo erhalten Sie die Umgebung eines Programms, während Sie es in GDB debuggen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy