Hier sind meine Ops:
%Vor% Wie Sie sehen, kann printf
environ[i]
ausgeben, aber p environ[i]
gibt mir Cannot access memory at address 0x0
, warum?
gdb löst das falsche environ
-Symbol auf. Ich weiß aber nicht warum. Siehe unten, warum.
Aber Sie können es testen. Ändern Sie das Programm zu:
%Vor%Lassen Sie uns das jetzt im Debugger ausführen.
%Vor% Also. Das aktuelle Programm hat während seiner Verknüpfung environ
an die Adresse 0x8049760 aufgelöst.
Wenn gdb auf das Symbol% co_de% zugreifen möchte, wird es in 0x46328da0 aufgelöst, was anders ist.
Bearbeiten. Es scheint, dass Ihr Symbol% co_de% tatsächlich mit dem Symbol% co_de% verknüpft ist. In gdb schreibe dies:
%Vor%Drücken Sie die Tab-Taste (zweimal), um die Symbole automatisch zu vervollständigen. Was ergibt:
%Vor% environ
ist derjenige, der tatsächlich mit environ
Dies gibt die gleiche Adresse wie das Programm 0x8049760:
%Vor%An einem bestimmten Punkt hat glibc das Symbol% co_de% abgelehnt und eine neuere Version
hinzugefügt Auf Umgebungsvariablen wird in C / C ++ mit der in getenv()
definierten Funktion stdlib.h
zugegriffen. Wenn Sie jedoch den Parameter envp
der Hauptfunktion verwenden, können Sie das folgende Beispiel verwenden, um über Umgebungsvariablen zu iterieren.
Getestet auf einem Mac
Es ist nichts falsch mit Ihrem Code. Ich habe es auf meinem Rechner ausprobiert und es hat die Umgebung wie erwartet gedruckt. Sie sollten getenv () nicht verwenden müssen.
Führen Sie diese Anwendung vom Terminal aus? Wenn nicht, solltest du sein. Andere Mittel zum Ausführen einer Anwendung könnten Ihren Binärcode aufrufen, ohne ihm die Umgebung zu übergeben.
Vom Terminal, was ist Ihre Ausgabe, wenn Sie "env" ausführen? Es sollte die gleiche Liste wie Ihr Programm ausgeben. Es funktioniert auf meiner Maschine.
Wahrscheinlich wird der zu debuggende Prozess mit
gestartet %Vor% und das extern char **environ
erhält dieses 2. NULL
, obwohl eine Umgebung verfügbar ist.
Mit ein wenig Änderung funktioniert Ihr Programm sowohl eigenständig als auch unter gdb
.
Warum und wie, dass NULL
in gdb
auf den richtigen Wert konvertiert wird Ich habe keine Ahnung.
Tags und Links c linux environment-variables gdb