Drucken IP-Adressen mit gdb
-
08-07-2019 - |
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?
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'}