4 Stimmen

Drucken von IP-Adressen mit gdb

Ich debugge gerade einen Netzwerkcode und möchte IP-Adressen ausgeben, die als int32 . Wenn ich es mit dem Befehl gdb print ausdrucke, erhalte ich einige Werte, die nicht sehr aussagekräftig sind.

Wie kann ich sie möglicherweise in einem sinnvollen Format ausdrucken?

10voto

Adam Rosenfield Punkte 373807

Verwenden Sie einfach inet_ntoa(3) als so:

(gdb) p (char*)inet_ntoa(0x01234567)  # Replace with your IP address
$1 = 0xa000b660 "103.69.35.1"

0 Stimmen

Ist etwas Ähnliches auch für IPv6-Adressen möglich?

0 Stimmen

Ich habe das vermutet und es sogar ausprobiert, bevor ich gefragt habe, aber was soll ich als drittes Argument anführen? Ich habe verschiedene Dinge ausprobiert, aber ich bekomme immer SIGSEGV.

0 Stimmen

Sie müssen ihm eine Adresse im Adressraum des unterlegenen Prozesses übergeben. Sie könnten irgendwo einen unbenutzten globalen Puffer nehmen, oder Sie könnten einfach malloc Sie selbst, z.B. (gdb) p (void*)malloc(64); $1 = (void *) 0x12345678; (gdb) p (char*)inet_ntop(23,&my_ip6_addr,0x12345678,64) .

7voto

Brad W Punkte 71

Wenn Sie eine Kerndatei debuggen und inet_ntoa() nicht verwenden können, können Sie auch etwas wie folgt tun:

(gdb) set $int\_ip = 0x01234567
(gdb) printf "%d.%d.%d.%d\\n", ($int\_ip & 0xff), ($int\_ip >> 8) & 0xff, ($int\_ip >> 16) & 0xff, ($int\_ip >> 24)
103.69.35.1
(gdb)

4voto

joe Punkte 41

Aber inet_ntoa() nimmt kein u_int32_t-Argument, sondern ein struct in_addr-Argument, daher die vorherige Antwort: p (char *)inet_ntoa(3) scheint mir falsch zu sein.

Hier ist eine Möglichkeit, eine Funktion in einer Datei namens gdb.cmd.txt zu definieren, so dass beim Start "gdb -x gdb.cmd.txt" aufgerufen wird.

Geben Sie in der gdb.cmd.txt Folgendes ein:

define ntoa
        set $ipv4 = $arg0
        echo IPV4 =.
        p $ipv4
        set $val1 = ($ipv4 >> 24) & 0xff
        set $val2 = ($ipv4 >> 16) & 0xff
        set $val3 = ($ipv4 >>  8) & 0xff
        set $val4 = ($ipv4 >>  0) & 0xff
       printf "IPV4=%u=0x%02x.%02x.%02x.%02x =%d.%d.%d.%d\n", $ipv4, $val1, $val2, $val3, $val4, $val1, $val2, $val3, $val4
    end

Führen Sie dann gdb aus und rufen Sie die ntoa "user defined function" wie folgt auf:

(gdb) ntoa(0x01020304) IPV4 =.$10 = 16909060 IPV4=16909060=0x01.02.03.04 =1.2.3.4 (gdb) ntoa(-1) IPV4 =.$10 = -1 IPV4=4294967295=0xff.ff.ff.ff =255.255.255.255

BTW: Ich suche jetzt, ob es in gdb eine Möglichkeit gibt, eine Funktion einen formatierten String zurückgeben zu lassen, so dass ich den Befehl "p ntoa(0x01020304)" oder "p ntoa(ptr->ipv4_addresss)" ausführen kann (vorausgesetzt, ptr ist ein gültiger ptr zu einer Struktur, die ein u_int32_t ipv4_address" Datenelement enthält). Aber es scheint, dass die benutzerdefinierten Funktionen von gdb keine sprintf()-Aufrufe erlauben.

-dennis bednar Dez. 2012

0 Stimmen

Beachten Sie, dass diese Antwort Ihre IP-Adressen auf Little-Endian-Systemen, wie z. B. x86, rückwärts ausgeben wird. Netzwerk-Byte-Order-Adressen (wie die, die normalerweise an inet_ntoa übergeben werden) werden auf diesen Architekturen mit dem ersten Oktett im niederwertigsten Byte gespeichert.

2voto

Rubio Terra Punkte 61

Erläuterung von Gopinaths Antwort:

(gdb) p/uc (char[4]) 342757386
$4 = {10 '\n', 16 '\020', 110 'n', 20 '\024'}

p/uc : weist gdb an, die Daten als unsigned char-Inhalt zu behandeln.

(char[4]) 342757386 IP: wandelt die IP in ein Array aus 4 Char-Elementen um, wobei jedes Element ein Byte/Oktett darstellt.

Sie weisen also gdb an, die dezimale Darstellung der IP als ein Array von vier Bytes - die vier Oktette - zu behandeln und sie dann als Zeichen ohne Vorzeichen auszugeben.

Wenn Sie die ASCII-Darstellung der einzelnen Bytes ignorieren, erhalten Sie Ihre IP-Adresse: 10.16.110.20 .

1voto

bmargulies Punkte 94152

Erstellen Sie eine Funktion, die inet_ntoa aufruft, und rufen Sie sie dann mit dem Befehl 'p' in gdb auf Ihrem int auf.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X