Frage

Ich bin Debuggen eines Netzwerk-Code und wollen IP-Adressen drucken, die als int32 deklariert sind.   wenn ich es mit GDB Druckbefehl zu drucken, erhalte ich einige Werte, die nicht viel sinnvoll ist.

Wie kann ich sie möglicherweise in sinnvollem Format drucken?

War es hilfreich?

Lösung

Verwenden Sie einfach inet_ntoa(3) wie so:

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

Andere Tipps

Wenn Sie eine Core-Datei debuggen und kann nicht verwendet werden inet_ntoa (), dann können Sie auch wie etwas 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) 

Aber inet_ntoa () muss kein u_int32_t Argument, sondern eine Struktur in_addr Argument, so die vorherige Antwort:      p (char *) inet_ntoa (3) scheint falsch zu mir.

Heres eine Möglichkeit, eine Funktion in einer Datei mit dem Namen gdb.cmd.txt zu definieren, so rufe "gdb -x gdb.cmd.txt" beim Start.

In der gdb.cmd.txt, setzen diese:

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

Dann gdb laufen, und rufen Sie die nTOA "benutzerdefinierte Funktion" wie folgt:

(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 jetzt die Suche mir, ob es Art und Weise in GDB ist eine Funktion zurückgeben eine Formatierter String zu haben, so dass ich den Befehl "p nTOA (0x01020304)" laufen kann oder "p nTOA (ptr-> ipv4_addresss)" ( ptr unter der Annahme, ist eine gültige ptr auf eine Struktur, die eine u_int32_t ipv4_address“Datenelement) enthält. Aber es scheint, dass gdb benutzerdefinierte Funktionen nicht zulassen sprintf () aufruft.

-Dennis Bednar Dezember 2012

Erstellen Sie eine Funktion, die inet_ntoa Anrufe, und sie rufen Sie dann mit dem Befehl ‚p‘ in GDB auf int.

Erklären Gopinath Antwort:

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

p/uc: sagt gdb die Daten als unsigned char Inhalt zu behandeln

.

(char[4]) 342757386. Wirft die IP auf ein Array von 4 char Elementen, die jeweils ein Byte repräsentiert / Oktett

So Sie gdb doch sagen, das Dezimalsystem represention des IP als ein Array von vier Bytes zu behandeln - die vier Oktetts -. Und drucken sie dann als unsigned chars

Wenn Sie die ASCII-Darstellung jedes Bytes ignorieren, haben Sie Ihre IP-Adresse:. 10.16.110.20

Hier ist eine weitere interessante Möglichkeit:

#include <sys/types.h>  // u_int32_t


// next 3 for inet_ntoa() call
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

// C++ headers
#include <iostream> // std::cout
#include <string>
#include <sstream>  // ostringstream


// class to aid in using the gdb(3) debugger to print a u_int32_t ip_address as a string.
// The toString() is a static method!!
// How to call a C++ method from the gdb debugger, to simulate the inet_nto(3) method
//
// From within gdb debugger, you must have a process, so first stop at main:
//  b main
//  r
//
//  (gdb) p MYIP4::toString(0x0fffefdfc)
//  $1 = "255.254.253.252"
//
//  (gdb) p MYIP4::toString(-1)
//  $2 = "255.255.255.255"
//
//  (gdb) p MYIP4::toString(65536)
//  $3 = "0.1.0.0"
//
// Drawbacks: the a.out executable that you are debugging needs the MYIP4 class already
// compiled and linked into the executable that you are debugging.
//
// PS: I don't know if there is a "slick way" where the MyIP4 class could dynamically be loaded,
// within gdb(), if the executable failed to contain the MYIP4 class.
//
// PS: I had trouble with my operator() idea.. If you know how to improve on it, post away!
//
// @author 1201207 dpb  created
//=============================

class MYIP4
{
public:
    static std::string toString(u_int32_t ipv4_address )
    {
        struct in_addr temp_addr;

        // inet_ntoa() returns a char * to a buffer which may be overwritten
        // soon, so convert char* to a string for extra safety.
        temp_addr.s_addr = htonl(ipv4_address);
        std::string ipv4String = std::string(inet_ntoa( temp_addr ));
        return ipv4String;
    }

#if 0
    // this idea did NOT work, so it is commented out.
    //
    // overload the () operator, so that, within gdb, we can simply type:
    //  p MYIP4(0x01020304)
    // instead of:
    //  p MYIP4::toString(0x01020304)

    std::string operator() ( u_int32_t ipv4_address )
    {
        return toString(ipv4_address);
    }
#endif

};


void test1();

int main()
{
    test1();
    return 0;
}

void test1()
{
    u_int32_t   ipv4Address = 0x01020304;   // host byte order for 1.2.3.4
    std::cout << "Test1: IPAddress=" << MYIP4::toString(ipv4Address) << "\n";
}

Versuchen Sie diesen Befehl ein:

(gdb) p/uc (char[4])342757386
$1 = {10 '\n', 16 '\020', 110 'n', 20 '\024'}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top