Warum kann ich Umgebungsvariablen in gdb nicht ausdrucken?

8
%Vor%

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?

    
compile-fan 01.06.2011, 15:13
quelle

5 Antworten

8

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

verknüpft ist

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     
nos 01.06.2011 16:55
quelle
0

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.

%Vor%

Getestet auf einem Mac

    
grundprinzip 01.06.2011 15:19
quelle
0

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.

    
gravitron 01.06.2011 15:22
quelle
0

Wie grundprinzip gesagt, benutze getenv (sz) und vergiss nicht den Rückgabewert zu überprüfen

Alternativ

%Vor%     
sehe 01.06.2011 15:24
quelle
0

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 .

%Vor%

Warum und wie, dass NULL in gdb auf den richtigen Wert konvertiert wird Ich habe keine Ahnung.

    
pmg 01.06.2011 15:44
quelle

Tags und Links